{
  "components": {
    "schemas": {
      "AnalyticsDimensionOut": {
        "properties": {
          "dimension": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dimension"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "title": "AnalyticsDimensionOut",
        "type": "object"
      },
      "AnalyticsMemberOut": {
        "properties": {
          "avg_score": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Avg Score"
          },
          "sessions": {
            "title": "Sessions",
            "type": "integer"
          },
          "trend_delta": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Trend Delta"
          }
        },
        "required": [
          "sessions"
        ],
        "title": "AnalyticsMemberOut",
        "type": "object"
      },
      "AnalyticsOut": {
        "description": "Aggregated team analytics; `members` is empty unless the team has `member_detail_enabled` and `leaderboard_enabled` on and at least 5 active members.",
        "example": {
          "dimensions": [
            {
              "dimension": "needs_analysis",
              "value": 71
            }
          ],
          "members": [],
          "skill_gaps": [
            "closing"
          ],
          "totals": {
            "active_members": 9,
            "avg_score": 71.5,
            "scored": 38,
            "sessions": 42
          },
          "trend": [
            {
              "score": 68
            },
            {
              "score": 72
            }
          ]
        },
        "properties": {
          "dimensions": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/AnalyticsDimensionOut"
            },
            "title": "Dimensions",
            "type": "array"
          },
          "members": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/AnalyticsMemberOut"
            },
            "title": "Members",
            "type": "array"
          },
          "skill_gaps": {
            "default": [],
            "items": {
              "type": "string"
            },
            "title": "Skill Gaps",
            "type": "array"
          },
          "totals": {
            "$ref": "#/components/schemas/AnalyticsTotalsOut"
          },
          "trend": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/AnalyticsTrendPointOut"
            },
            "title": "Trend",
            "type": "array"
          }
        },
        "required": [
          "totals"
        ],
        "title": "AnalyticsOut",
        "type": "object"
      },
      "AnalyticsTotalsOut": {
        "properties": {
          "active_members": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Active Members"
          },
          "avg_score": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Avg Score"
          },
          "scored": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scored"
          },
          "sessions": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sessions"
          }
        },
        "title": "AnalyticsTotalsOut",
        "type": "object"
      },
      "AnalyticsTrendPointOut": {
        "properties": {
          "score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Score"
          }
        },
        "title": "AnalyticsTrendPointOut",
        "type": "object"
      },
      "AssignmentCreateBody": {
        "properties": {
          "due_date": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Due Date"
          },
          "industry_id": {
            "title": "Industry Id",
            "type": "string"
          },
          "member_id": {
            "title": "Member Id",
            "type": "string"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Note"
          },
          "personality_id": {
            "title": "Personality Id",
            "type": "string"
          },
          "situation_id": {
            "title": "Situation Id",
            "type": "string"
          },
          "title": {
            "maxLength": 120,
            "minLength": 1,
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "member_id",
          "title",
          "situation_id",
          "personality_id",
          "industry_id"
        ],
        "title": "AssignmentCreateBody",
        "type": "object"
      },
      "AssignmentOut": {
        "example": {
          "created_at": "2026-10-01T09:00:00Z",
          "due_date": "2026-10-20",
          "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
          "industry_id": "saas",
          "member_email": "anna@example.com",
          "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
          "personality_id": "skeptiker",
          "situation_id": "kaltakquise",
          "status": "open",
          "title": "Practise cold calling"
        },
        "properties": {
          "completed_training_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed Training Id"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "due_date": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Due Date"
          },
          "focus_dimension": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Focus Dimension"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "industry_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Industry Id"
          },
          "member_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member Email"
          },
          "member_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Member User Id"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Note"
          },
          "personality_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Personality Id"
          },
          "situation_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Situation Id"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "id",
          "status"
        ],
        "title": "AssignmentOut",
        "type": "object"
      },
      "AssignmentUpdateBody": {
        "properties": {
          "due_date": {
            "anyOf": [
              {
                "format": "date",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Due Date"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Note"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status"
          }
        },
        "title": "AssignmentUpdateBody",
        "type": "object"
      },
      "AssignmentsPage": {
        "example": {
          "data": [
            {
              "created_at": "2026-10-01T09:00:00Z",
              "due_date": "2026-10-20",
              "id": "9a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9",
              "industry_id": "saas",
              "member_email": "anna@example.com",
              "member_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
              "personality_id": "skeptiker",
              "situation_id": "kaltakquise",
              "status": "open",
              "title": "Practise cold calling"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/AssignmentOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "AssignmentsPage",
        "type": "object"
      },
      "CaseCreateBody": {
        "properties": {
          "external_ref": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Ref"
          },
          "fields": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fields"
          },
          "persona_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Persona Id"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "title": "CaseCreateBody",
        "type": "object"
      },
      "CaseOut": {
        "example": {
          "created_at": "2026-09-20T07:00:00Z",
          "external_ref": {
            "id": "123",
            "object": "deal",
            "system": "hubspot"
          },
          "fields": {},
          "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
          "persona_id": "kaltakquise:skeptiker:saas",
          "title": "Deal Acme Corp",
          "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
        },
        "properties": {
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "external_ref": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Ref"
          },
          "fields": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "items": {},
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fields"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "persona_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Persona Id"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "user_id"
        ],
        "title": "CaseOut",
        "type": "object"
      },
      "CaseUpdateBody": {
        "properties": {
          "external_ref": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Ref"
          },
          "fields": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fields"
          },
          "persona_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Persona Id"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "title": "CaseUpdateBody",
        "type": "object"
      },
      "CasesPage": {
        "example": {
          "data": [
            {
              "created_at": "2026-09-20T07:00:00Z",
              "external_ref": {
                "id": "123",
                "object": "deal",
                "system": "hubspot"
              },
              "fields": {},
              "id": "5c6d7e8f-9011-4213-8495-c6d7e8f90123",
              "persona_id": "kaltakquise:skeptiker:saas",
              "title": "Deal Acme Corp",
              "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/CaseOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "CasesPage",
        "type": "object"
      },
      "CatalogEntryOut": {
        "properties": {
          "icon": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Icon"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          }
        },
        "required": [
          "id"
        ],
        "title": "CatalogEntryOut",
        "type": "object"
      },
      "CatalogOut": {
        "description": "Catalog entries grouped by area (situation, personality, industry, role, methodology).",
        "example": {
          "industry": [
            {
              "icon": "cloud",
              "id": "saas",
              "name": "SaaS"
            }
          ],
          "methodology": [
            {
              "icon": "list",
              "id": "needs_qual",
              "name": "Needs qualification"
            }
          ],
          "personality": [
            {
              "icon": "shield",
              "id": "skeptiker",
              "name": "Skeptic"
            }
          ],
          "role": [
            {
              "icon": "briefcase",
              "id": "einkauf",
              "name": "Procurement"
            }
          ],
          "situation": [
            {
              "icon": "phone",
              "id": "kaltakquise",
              "name": "Cold calling"
            }
          ]
        },
        "properties": {
          "industry": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/CatalogEntryOut"
            },
            "title": "Industry",
            "type": "array"
          },
          "methodology": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/CatalogEntryOut"
            },
            "title": "Methodology",
            "type": "array"
          },
          "personality": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/CatalogEntryOut"
            },
            "title": "Personality",
            "type": "array"
          },
          "role": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/CatalogEntryOut"
            },
            "title": "Role",
            "type": "array"
          },
          "situation": {
            "default": [],
            "items": {
              "$ref": "#/components/schemas/CatalogEntryOut"
            },
            "title": "Situation",
            "type": "array"
          }
        },
        "title": "CatalogOut",
        "type": "object"
      },
      "CrmDealOut": {
        "description": "A synchronized CRM deal. `owner_user_id` is omitted unless `member_detail_enabled` is on for the team.",
        "example": {
          "amount": "1000.00",
          "close_date": "2026-11-01",
          "currency": "EUR",
          "external_id": "123",
          "id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
          "industry_id": "saas",
          "last_activity_at": "2026-10-10T09:00:00Z",
          "outcome": "open",
          "owner_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
          "pipeline_id": "default",
          "probability": 60,
          "stage_id": "contractsent",
          "synced_at": "2026-10-14T06:00:00Z",
          "title": "Acme Corp"
        },
        "properties": {
          "amount": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Amount"
          },
          "close_date": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Close Date"
          },
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Currency"
          },
          "external_id": {
            "title": "External Id",
            "type": "string"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "industry_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Industry Id"
          },
          "last_activity_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Activity At"
          },
          "lost_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lost Reason"
          },
          "outcome": {
            "title": "Outcome",
            "type": "string"
          },
          "owner_user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner User Id"
          },
          "pipeline_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pipeline Id"
          },
          "probability": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Probability"
          },
          "stage_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stage Id"
          },
          "synced_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Synced At"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          }
        },
        "required": [
          "id",
          "external_id",
          "outcome"
        ],
        "title": "CrmDealOut",
        "type": "object"
      },
      "CrmDealsPage": {
        "example": {
          "data": [
            {
              "amount": "1000.00",
              "close_date": "2026-11-01",
              "currency": "EUR",
              "external_id": "123",
              "id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
              "industry_id": "saas",
              "last_activity_at": "2026-10-10T09:00:00Z",
              "outcome": "open",
              "owner_user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
              "pipeline_id": "default",
              "probability": 60,
              "stage_id": "contractsent",
              "synced_at": "2026-10-14T06:00:00Z",
              "title": "Acme Corp"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/CrmDealOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "CrmDealsPage",
        "type": "object"
      },
      "CrmObjectionOut": {
        "example": {
          "category": "price",
          "created_at": "2026-10-09T11:00:00Z",
          "deal_id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
          "id": "42",
          "lang": "en",
          "text": "Too expensive compared to the incumbent."
        },
        "properties": {
          "category": {
            "title": "Category",
            "type": "string"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "deal_id": {
            "title": "Deal Id",
            "type": "string"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "lang": {
            "title": "Lang",
            "type": "string"
          },
          "text": {
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "id",
          "deal_id",
          "category",
          "text",
          "lang"
        ],
        "title": "CrmObjectionOut",
        "type": "object"
      },
      "CrmObjectionsPage": {
        "example": {
          "data": [
            {
              "category": "price",
              "created_at": "2026-10-09T11:00:00Z",
              "deal_id": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809",
              "id": "42",
              "lang": "en",
              "text": "Too expensive compared to the incumbent."
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/CrmObjectionOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "CrmObjectionsPage",
        "type": "object"
      },
      "EvaluationDetailOut": {
        "example": {
          "biggest_lever": "Close earlier",
          "goal": "partial",
          "methodology": "needs_qual",
          "score": {
            "dimensions": {
              "closing": 72,
              "conversation_control": 78,
              "needs_analysis": 71,
              "objection_handling": 80,
              "value_argument": 69
            },
            "spread": 3,
            "total": 74
          },
          "strongest": "Good discovery questions",
          "tips": [
            {
              "impact": "sounds more confident",
              "issue": "too hesitant",
              "moment": "Line 4",
              "principle": "State it clearly",
              "rewrite": "Let's lock that in."
            }
          ],
          "training_id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
          "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
        },
        "properties": {
          "biggest_lever": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Biggest Lever"
          },
          "goal": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Goal"
          },
          "methodology": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Methodology"
          },
          "score": {
            "$ref": "#/components/schemas/ScoreOut"
          },
          "strongest": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Strongest"
          },
          "tips": {
            "items": {
              "$ref": "#/components/schemas/TipOut"
            },
            "title": "Tips",
            "type": "array"
          },
          "training_id": {
            "title": "Training Id",
            "type": "string"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "training_id",
          "user_id",
          "score",
          "tips"
        ],
        "title": "EvaluationDetailOut",
        "type": "object"
      },
      "InviteBody": {
        "properties": {
          "email": {
            "title": "Email",
            "type": "string"
          },
          "lang": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lang"
          },
          "role": {
            "default": "member",
            "title": "Role",
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "title": "InviteBody",
        "type": "object"
      },
      "MeOut": {
        "example": {
          "kind": "team",
          "privacy": {
            "member_detail_enabled": true
          },
          "rate_limit_per_min": 600,
          "scopes": [
            "users:read",
            "trainings:read"
          ],
          "tenant_id": "6a9c3e3e-9b8e-4b7b-9e9d-2b7b1a2c3d4e"
        },
        "properties": {
          "kind": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Kind"
          },
          "privacy": {
            "$ref": "#/components/schemas/PrivacyOut"
          },
          "rate_limit_per_min": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rate Limit Per Min"
          },
          "scopes": {
            "items": {
              "type": "string"
            },
            "title": "Scopes",
            "type": "array"
          },
          "tenant_id": {
            "title": "Tenant Id",
            "type": "string"
          }
        },
        "required": [
          "tenant_id",
          "scopes",
          "privacy"
        ],
        "title": "MeOut",
        "type": "object"
      },
      "PrivacyOut": {
        "properties": {
          "member_detail_enabled": {
            "title": "Member Detail Enabled",
            "type": "boolean"
          }
        },
        "required": [
          "member_detail_enabled"
        ],
        "title": "PrivacyOut",
        "type": "object"
      },
      "Problem": {
        "description": "Error body (RFC 9457, `application/problem+json`).",
        "properties": {
          "code": {
            "description": "Stable, machine-readable error code — never localized. Branch your code on this field, not on `title`.",
            "type": "string"
          },
          "detail": {
            "description": "Optional internal, English diagnostic detail. Present only on some 4xx errors, never on 500/503 (no internals leak).",
            "type": "string"
          },
          "dimension": {
            "description": "Which catalog dimension (`situation`, `role`, `industry`, …) caused `kombination_ungueltig`. Present only on that code.",
            "type": "string"
          },
          "errors": {
            "description": "Which field(s) failed and why. Present only when `RequestValidationError` (a malformed query, path or JSON value) raises `validation_error`.",
            "items": {
              "type": "object"
            },
            "type": "array"
          },
          "field": {
            "description": "The single field that failed. Present only on some `validation_error` responses raised by application code (as opposed to `errors`, from request parsing).",
            "type": "string"
          },
          "id": {
            "description": "The offending id, when `kombination_ungueltig` was caused by an unknown or invisible id rather than an incompatible combination. Present only on that code, and only sometimes.",
            "type": "string"
          },
          "request_id": {
            "description": "Also returned as the `X-Request-Id` response header; include it when contacting support.",
            "format": "uuid",
            "type": "string"
          },
          "required_scope": {
            "description": "The scope this call was missing. Present only on `insufficient_scope`.",
            "type": "string"
          },
          "retry_after": {
            "description": "Seconds to wait before retrying. Present only on `rate_limited` (repeats the `Retry-After` header).",
            "type": "integer"
          },
          "status": {
            "description": "Repeats the HTTP status code.",
            "type": "integer"
          },
          "title": {
            "description": "Human-readable summary, localized via `Accept-Language` (`de` or `en`; anything else falls back to `de`).",
            "type": "string"
          },
          "type": {
            "description": "A stable identifier for this error, as a URI. Match on `code`, not on this URI's text.",
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "code",
          "request_id"
        ],
        "type": "object"
      },
      "RoleBody": {
        "properties": {
          "role": {
            "title": "Role",
            "type": "string"
          }
        },
        "required": [
          "role"
        ],
        "title": "RoleBody",
        "type": "object"
      },
      "ScoreOut": {
        "properties": {
          "dimensions": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "Dimensions",
            "type": "object"
          },
          "spread": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spread"
          },
          "total": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total"
          }
        },
        "required": [
          "dimensions"
        ],
        "title": "ScoreOut",
        "type": "object"
      },
      "TipOut": {
        "properties": {
          "impact": {
            "title": "Impact",
            "type": "string"
          },
          "issue": {
            "title": "Issue",
            "type": "string"
          },
          "moment": {
            "title": "Moment",
            "type": "string"
          },
          "principle": {
            "title": "Principle",
            "type": "string"
          },
          "rewrite": {
            "title": "Rewrite",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "moment",
          "principle",
          "rewrite",
          "impact"
        ],
        "title": "TipOut",
        "type": "object"
      },
      "TrainingOut": {
        "example": {
          "created_at": "2026-10-14T08:30:00Z",
          "duration_s": 900,
          "finished_at": "2026-10-14T08:42:10Z",
          "id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
          "industry_id": "saas",
          "personality_id": "skeptiker",
          "role_id": "einkauf",
          "situation_id": "kaltakquise",
          "source": "app",
          "status": "scored",
          "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
        },
        "properties": {
          "assignment_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assignment Id"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "duration_s": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration S"
          },
          "external_ref": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Ref"
          },
          "finished_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Finished At"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "industry_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Industry Id"
          },
          "personality_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Personality Id"
          },
          "role_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Role Id"
          },
          "situation_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Situation Id"
          },
          "source": {
            "title": "Source",
            "type": "string"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "user_id": {
            "title": "User Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "user_id",
          "status",
          "source"
        ],
        "title": "TrainingOut",
        "type": "object"
      },
      "TrainingsPage": {
        "example": {
          "data": [
            {
              "created_at": "2026-10-14T08:30:00Z",
              "duration_s": 900,
              "finished_at": "2026-10-14T08:42:10Z",
              "id": "7f3cfe1a-1111-4b22-9c33-abcdef012345",
              "industry_id": "saas",
              "personality_id": "skeptiker",
              "role_id": "einkauf",
              "situation_id": "kaltakquise",
              "source": "app",
              "status": "scored",
              "user_id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/TrainingOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "TrainingsPage",
        "type": "object"
      },
      "UserOut": {
        "example": {
          "email": "anna@example.com",
          "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
          "joined_at": "2026-09-01T08:00:00Z",
          "role": "member",
          "status": "active",
          "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
        },
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "joined_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Joined At"
          },
          "role": {
            "title": "Role",
            "type": "string"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "User Id"
          }
        },
        "required": [
          "id",
          "role",
          "status"
        ],
        "title": "UserOut",
        "type": "object"
      },
      "UsersPage": {
        "example": {
          "data": [
            {
              "email": "anna@example.com",
              "id": "1b9e2b3c-4d5e-6f70-8192-a3b4c5d6e7f8",
              "joined_at": "2026-09-01T08:00:00Z",
              "role": "member",
              "status": "active",
              "user_id": "2c0f3c4d-5e6f-7081-92a3-b4c5d6e7f809"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/UserOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "UsersPage",
        "type": "object"
      },
      "WebhookDeliveriesPage": {
        "example": {
          "data": [
            {
              "attempt": 1,
              "created_at": "2026-10-14T07:59:00Z",
              "event_type": "training.completed",
              "id": "42",
              "next_try_at": "2026-10-14T08:00:00Z",
              "response_code": 200,
              "response_excerpt": "ok",
              "response_ms": 120,
              "status": "ok"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/WebhookDeliveryOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "WebhookDeliveriesPage",
        "type": "object"
      },
      "WebhookDeliveryOut": {
        "example": {
          "attempt": 1,
          "created_at": "2026-10-14T07:59:00Z",
          "event_type": "training.completed",
          "id": "42",
          "next_try_at": "2026-10-14T08:00:00Z",
          "response_code": 200,
          "response_excerpt": "ok",
          "response_ms": 120,
          "status": "ok"
        },
        "properties": {
          "attempt": {
            "title": "Attempt",
            "type": "integer"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "event_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Event Type"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "next_try_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Try At"
          },
          "response_code": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Response Code"
          },
          "response_excerpt": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Response Excerpt"
          },
          "response_ms": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Response Ms"
          },
          "status": {
            "title": "Status",
            "type": "string"
          }
        },
        "required": [
          "id",
          "attempt",
          "status"
        ],
        "title": "WebhookDeliveryOut",
        "type": "object"
      },
      "WebhookEndpointCreate": {
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "events": {
            "items": {
              "type": "string"
            },
            "title": "Events",
            "type": "array"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "url",
          "events"
        ],
        "title": "WebhookEndpointCreate",
        "type": "object"
      },
      "WebhookEndpointCreatedOut": {
        "example": {
          "api_version": "2026-10",
          "created_at": "2026-10-01T09:00:00Z",
          "description": "CRM sync",
          "events": [
            "training.completed",
            "evaluation.completed"
          ],
          "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
          "last_success_at": "2026-10-14T08:00:00Z",
          "secret": "whsec_7f3c1a2b3c4d5e6f70819293a4b5c6d7",
          "status": "active",
          "url": "https://hooks.example.com/sip"
        },
        "properties": {
          "api_version": {
            "title": "Api Version",
            "type": "string"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "events": {
            "items": {
              "type": "string"
            },
            "title": "Events",
            "type": "array"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "last_success_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Success At"
          },
          "secret": {
            "title": "Secret",
            "type": "string"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "id",
          "url",
          "events",
          "status",
          "api_version",
          "secret"
        ],
        "title": "WebhookEndpointCreatedOut",
        "type": "object"
      },
      "WebhookEndpointOut": {
        "example": {
          "api_version": "2026-10",
          "created_at": "2026-10-01T09:00:00Z",
          "description": "CRM sync",
          "events": [
            "training.completed",
            "evaluation.completed"
          ],
          "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
          "last_success_at": "2026-10-14T08:00:00Z",
          "status": "active",
          "url": "https://hooks.example.com/sip"
        },
        "properties": {
          "api_version": {
            "title": "Api Version",
            "type": "string"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "events": {
            "items": {
              "type": "string"
            },
            "title": "Events",
            "type": "array"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "last_success_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Success At"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "id",
          "url",
          "events",
          "status",
          "api_version"
        ],
        "title": "WebhookEndpointOut",
        "type": "object"
      },
      "WebhookEndpointUpdate": {
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "events": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Events"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status"
          },
          "url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Url"
          }
        },
        "title": "WebhookEndpointUpdate",
        "type": "object"
      },
      "WebhookEndpointsPage": {
        "example": {
          "data": [
            {
              "api_version": "2026-10",
              "created_at": "2026-10-01T09:00:00Z",
              "description": "CRM sync",
              "events": [
                "training.completed",
                "evaluation.completed"
              ],
              "id": "7c3b2a1d-0000-4000-8000-0123456789ab",
              "last_success_at": "2026-10-14T08:00:00Z",
              "status": "active",
              "url": "https://hooks.example.com/sip"
            }
          ]
        },
        "properties": {
          "data": {
            "items": {
              "$ref": "#/components/schemas/WebhookEndpointOut"
            },
            "title": "Data",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "data"
        ],
        "title": "WebhookEndpointsPage",
        "type": "object"
      },
      "WebhookTestOut": {
        "example": {
          "delivery_id": "42",
          "status": "pending"
        },
        "properties": {
          "delivery_id": {
            "title": "Delivery Id",
            "type": "string"
          },
          "status": {
            "title": "Status",
            "type": "string"
          }
        },
        "required": [
          "delivery_id",
          "status"
        ],
        "title": "WebhookTestOut",
        "type": "object"
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "bearerFormat": "sipk_live_<8-char prefix>_<secret>",
        "description": "A customer API key, created under *Team → Integrations & API → API keys*. 256 bits of secret, hashed at rest; scopes are fixed when the key is created. See the authentication guide in the self-hosted reference.",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "contact": {
      "email": "sip@estaya-beyond.com",
      "name": "sip.coach",
      "url": "https://sip.coach/entwickler/api/"
    },
    "description": "Server-to-server API for customers of sip.coach: read members, trainings and evaluations, manage assignments and cases, read the catalog and team analytics, and receive webhooks for completed trainings and evaluations.\n\nThis is the **customer API** (one tenant per request, authenticated with a key your team creates under *Team → Integrations & API*). It is a different surface from the CRM connector apps on the sip.coach marketplace, which are not documented here.\n\nGuides and a self-hosted reference with runnable examples: [sip.coach/entwickler/api](https://sip.coach/entwickler/api/) (German) and [sip.coach/en/developers/api](https://sip.coach/en/developers/api/) (English). This document (`openapi.v1.json`) is the machine-readable source of that reference — both are generated from the same code and kept in sync by an automated test.\n\n**Authentication.** `Authorization: Bearer sipk_live_<prefix>_<secret>`. Create and manage keys under *Team → Integrations & API → API keys* in the app (requires the team right `schnittstellen`; available on Team and Enterprise plans).\n\n**Tenancy.** The tenant is always the one bound to the key — never a parameter you send. A foreign id returns `404` exactly like an id that never existed.\n\n**Errors.** [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457) `application/problem+json`, see the `Problem` schema and the error guide in the reference above.\n\n**Versioning.** Path version `v1`. Within `v1`, only additive changes (new fields, new routes, new webhook event types) — unknown fields must be ignored by clients. A breaking change ships as `v2` alongside `v1` for at least 12 months, announced with `Deprecation`/`Sunset` response headers and an email to every admin with an active key.\n",
    "title": "sip.coach Customer API",
    "version": "2026-10"
  },
  "openapi": "3.1.0",
  "paths": {
    "/api/public/v1/analytics/team": {
      "get": {
        "description": "Aggregated team analytics; `members` is empty unless the team has `member_detail_enabled` and `leaderboard_enabled` on and at least 5 active members.",
        "operationId": "getTeamAnalytics",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalyticsOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get team analytics",
        "tags": [
          "Read"
        ],
        "x-scope": "analytics:read"
      }
    },
    "/api/public/v1/assignments": {
      "get": {
        "description": "Team assignments. Requires `member_detail_enabled` on the team; otherwise 403 `privacy_restricted`.",
        "operationId": "listAssignments",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List assignments",
        "tags": [
          "Read"
        ],
        "x-scope": "assignments:read"
      },
      "post": {
        "description": "Checks the combination against the recipient's effective policy; 403 ``vorgabe_gesperrt`` if blocked.",
        "operationId": "createAssignment",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "due_date": "2026-10-15",
                "industry_id": "saas",
                "member_id": "b3b2b1a0-1234-4a3b-8c9d-0e1f2a3b4c5d",
                "personality_id": "skeptiker",
                "situation_id": "kaltakquise",
                "title": "Objection handling drill"
              },
              "schema": {
                "$ref": "#/components/schemas/AssignmentCreateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "vorgabe_gesperrt": {
                    "summary": "Blocked by policy",
                    "value": {
                      "code": "vorgabe_gesperrt",
                      "dimension": "situation",
                      "id": "kaltakquise",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Blocked by policy",
                      "type": "https://sip.coach/entwickler/api/fehler#vorgabe_gesperrt"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / A policy assigned to the recipient blocks this situation, personality or industry combination.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "kombination_ungueltig": {
                    "summary": "Invalid combination",
                    "value": {
                      "code": "kombination_ungueltig",
                      "dimension": "industry",
                      "id": "does-not-exist",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Invalid combination",
                      "type": "https://sip.coach/entwickler/api/fehler#kombination_ungueltig"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use. / The situation, personality or industry id is unknown, not visible to this team, or violates a catalog rule.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Create an assignment",
        "tags": [
          "Write"
        ],
        "x-scope": "assignments:write"
      }
    },
    "/api/public/v1/assignments/{assignment_id}": {
      "delete": {
        "description": "Deletes the assignment. 404 for a foreign or unknown id.",
        "operationId": "deleteAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignment_id",
            "required": true,
            "schema": {
              "title": "Assignment Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                },
                "schema": {
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete an assignment",
        "tags": [
          "Write"
        ],
        "x-scope": "assignments:write"
      },
      "get": {
        "description": "A single team assignment; a foreign id returns 404. Requires ``member_detail_enabled`` on the team; otherwise 403 ``privacy_restricted``.",
        "operationId": "getAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignment_id",
            "required": true,
            "schema": {
              "title": "Assignment Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get an assignment",
        "tags": [
          "Read"
        ],
        "x-scope": "assignments:read"
      },
      "patch": {
        "description": "Updates `status`, `note` and/or `due_date`. 404 for a foreign or unknown id.",
        "operationId": "updateAssignment",
        "parameters": [
          {
            "in": "path",
            "name": "assignment_id",
            "required": true,
            "schema": {
              "title": "Assignment Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "status": "done"
              },
              "schema": {
                "$ref": "#/components/schemas/AssignmentUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssignmentOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Update an assignment",
        "tags": [
          "Write"
        ],
        "x-scope": "assignments:write"
      }
    },
    "/api/public/v1/cases": {
      "get": {
        "description": "Team cases only — a member's private case is never returned. Requires ``member_detail_enabled`` on the team; otherwise 403 ``privacy_restricted``.",
        "operationId": "listCases",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "user_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "User Id"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CasesPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List cases",
        "tags": [
          "Read"
        ],
        "x-scope": "cases:read"
      },
      "post": {
        "description": "``user_id`` must be an active member of the calling team; a foreign or unknown id returns 404.",
        "operationId": "createCase",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "fields": {
                  "amount": 12000,
                  "stage": "negotiation"
                },
                "title": "Acme Corp — renewal",
                "user_id": "b3b2b1a0-1234-4a3b-8c9d-0e1f2a3b4c5d"
              },
              "schema": {
                "$ref": "#/components/schemas/CaseCreateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Create a case",
        "tags": [
          "Write"
        ],
        "x-scope": "cases:write"
      }
    },
    "/api/public/v1/cases/{case_id}": {
      "delete": {
        "description": "Deletes the case. 404 for a foreign or unknown id.",
        "operationId": "deleteCase",
        "parameters": [
          {
            "in": "path",
            "name": "case_id",
            "required": true,
            "schema": {
              "title": "Case Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                },
                "schema": {
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete a case",
        "tags": [
          "Write"
        ],
        "x-scope": "cases:write"
      },
      "get": {
        "description": "A single team case; a foreign id returns 404. Requires ``member_detail_enabled`` on the team; otherwise 403 ``privacy_restricted``.",
        "operationId": "getCase",
        "parameters": [
          {
            "in": "path",
            "name": "case_id",
            "required": true,
            "schema": {
              "title": "Case Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get a case",
        "tags": [
          "Read"
        ],
        "x-scope": "cases:read"
      },
      "patch": {
        "description": "Updates `title`, `fields`, `persona_id` and/or `external_ref`. 404 for a foreign or unknown id.",
        "operationId": "updateCase",
        "parameters": [
          {
            "in": "path",
            "name": "case_id",
            "required": true,
            "schema": {
              "title": "Case Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "fields": {
                  "stage": "won"
                }
              },
              "schema": {
                "$ref": "#/components/schemas/CaseUpdateBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CaseOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Update a case",
        "tags": [
          "Write"
        ],
        "x-scope": "cases:write"
      }
    },
    "/api/public/v1/catalog": {
      "get": {
        "description": "Platform catalog restricted to the team's effective policy, labelled by `Accept-Language`.",
        "operationId": "getCatalog",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CatalogOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get the catalog",
        "tags": [
          "Read"
        ],
        "x-scope": "catalog:read"
      }
    },
    "/api/public/v1/crm/deals": {
      "get": {
        "description": "``owner_user_id`` is present only when ``member_detail_enabled`` is on for the team; otherwise the field is left out (other fields are unaffected).",
        "operationId": "listCrmDeals",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmDealsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List synchronized CRM deals",
        "tags": [
          "Write"
        ],
        "x-scope": "cases:read"
      }
    },
    "/api/public/v1/crm/objections": {
      "get": {
        "description": "The team's synchronized objection catalog, paginated.",
        "operationId": "listCrmObjections",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CrmObjectionsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List the team's objection catalog",
        "tags": [
          "Write"
        ],
        "x-scope": "cases:read"
      }
    },
    "/api/public/v1/evaluations": {
      "get": {
        "description": "Scored training sessions for reconciliation via ``?updated_since=``; same shape as ``GET /trainings``.",
        "operationId": "listEvaluations",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "updated_since",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Updated Since"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List scored trainings",
        "tags": [
          "Read"
        ],
        "x-scope": "evaluations:read"
      }
    },
    "/api/public/v1/me": {
      "get": {
        "description": "Tenant, scopes, rate limit and privacy switches of the API key used.",
        "operationId": "getTenant",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get the current tenant",
        "tags": [
          "Read"
        ],
        "x-scope": null
      }
    },
    "/api/public/v1/trainings": {
      "get": {
        "description": "Training sessions of active members, filtered by ``user_id``, ``status``, ``since`` and ``assignment_id``. Requires ``member_detail_enabled`` on the team; otherwise 403 ``privacy_restricted``.",
        "operationId": "listTrainings",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "user_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "User Id"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "since",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Since"
            }
          },
          {
            "in": "query",
            "name": "assignment_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Assignment Id"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List trainings",
        "tags": [
          "Read"
        ],
        "x-scope": "trainings:read"
      }
    },
    "/api/public/v1/trainings/{training_id}": {
      "get": {
        "description": "Metadata of a single training session; no transcript in v1.",
        "operationId": "getTraining",
        "parameters": [
          {
            "in": "path",
            "name": "training_id",
            "required": true,
            "schema": {
              "title": "Training Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get a training",
        "tags": [
          "Read"
        ],
        "x-scope": "trainings:read"
      }
    },
    "/api/public/v1/trainings/{training_id}/evaluation": {
      "get": {
        "description": "Score, five dimensions, goal, strongest point, biggest lever and up to five tips of a scored training. 404 until scored.",
        "operationId": "getTrainingEvaluation",
        "parameters": [
          {
            "in": "path",
            "name": "training_id",
            "required": true,
            "schema": {
              "title": "Training Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EvaluationDetailOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  },
                  "privacy_restricted": {
                    "summary": "Restricted by privacy setting",
                    "value": {
                      "code": "privacy_restricted",
                      "detail": "member_detail_enabled is off for this team",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Restricted by privacy setting",
                      "type": "https://sip.coach/entwickler/api/fehler#privacy_restricted"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked. / The team has turned off `member_detail_enabled`; this route exposes per-person data and is unavailable until it is turned on again.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get an evaluation",
        "tags": [
          "Read"
        ],
        "x-scope": "evaluations:read"
      }
    },
    "/api/public/v1/users": {
      "get": {
        "description": "Active and invited team members. ``email`` is present only when the team's ``member_detail_enabled`` switch is on.",
        "operationId": "listUsers",
        "parameters": [
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UsersPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List members",
        "tags": [
          "Read"
        ],
        "x-scope": "users:read"
      },
      "post": {
        "description": "Invites a new team member by email. 409 `seat_limit_reached` if no seat is free; 409 `conflict` if the email already belongs to a member of this team or is the team's owner. A role other than `member` grants that role's rights and follows the same rules as `PATCH /users/{member_id}` (403 `insufficient_scope` otherwise). Rate limited to 60 invitations per hour per team.",
        "operationId": "inviteUser",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "email": "jordan@example.com",
                "role": "member"
              },
              "schema": {
                "$ref": "#/components/schemas/InviteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "conflict": {
                    "summary": "Conflict",
                    "value": {
                      "code": "conflict",
                      "detail": "member already exists",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Conflict",
                      "type": "https://sip.coach/entwickler/api/fehler#conflict"
                    }
                  },
                  "seat_limit_reached": {
                    "summary": "Seat limit reached",
                    "value": {
                      "code": "seat_limit_reached",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Seat limit reached",
                      "type": "https://sip.coach/entwickler/api/fehler#seat_limit_reached"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The email already belongs to a member of this team or the team's owner, or a concurrent call with the same `Idempotency-Key` is still in progress. / All of the team's seats are taken; free one or increase `seats_total` in the app first.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Invite a member",
        "tags": [
          "Write"
        ],
        "x-scope": "users:write"
      }
    },
    "/api/public/v1/users/{member_id}": {
      "delete": {
        "description": "409 ``owner`` if the member is the team's owner; 409 ``last_admin`` if the member is the team's only active admin. Revokes any learning assignments in the same step.",
        "operationId": "removeUser",
        "parameters": [
          {
            "in": "path",
            "name": "member_id",
            "required": true,
            "schema": {
              "title": "Member Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                },
                "schema": {
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "last_admin": {
                    "summary": "Last administrator",
                    "value": {
                      "code": "last_admin",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Last administrator",
                      "type": "https://sip.coach/entwickler/api/fehler#last_admin"
                    }
                  },
                  "owner": {
                    "summary": "Owner cannot be removed",
                    "value": {
                      "code": "owner",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Owner cannot be removed",
                      "type": "https://sip.coach/entwickler/api/fehler#owner"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The team's owner cannot have their role changed or be removed through this API. / This member is the team's only active `admin`; changing their role or removing them would leave the team without one.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "End a membership",
        "tags": [
          "Write"
        ],
        "x-scope": "users:write"
      },
      "get": {
        "description": "A single team member; a foreign id returns 404.",
        "operationId": "getUser",
        "parameters": [
          {
            "in": "path",
            "name": "member_id",
            "required": true,
            "schema": {
              "title": "Member Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Get a member",
        "tags": [
          "Read"
        ],
        "x-scope": "users:read"
      },
      "patch": {
        "description": "409 ``last_admin`` if this would leave the team without any ``admin`` member; 409 ``owner`` for the team's owner. Granting or revoking the ``admin`` role requires a key created by the team's owner or an active admin, otherwise 403 ``insufficient_scope``. ``email`` is present only when the team's ``member_detail_enabled`` switch is on.",
        "operationId": "updateUserRole",
        "parameters": [
          {
            "in": "path",
            "name": "member_id",
            "required": true,
            "schema": {
              "title": "Member Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "role": "admin"
              },
              "schema": {
                "$ref": "#/components/schemas/RoleBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "last_admin": {
                    "summary": "Last administrator",
                    "value": {
                      "code": "last_admin",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Last administrator",
                      "type": "https://sip.coach/entwickler/api/fehler#last_admin"
                    }
                  },
                  "owner": {
                    "summary": "Owner cannot be removed",
                    "value": {
                      "code": "owner",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 409,
                      "title": "Owner cannot be removed",
                      "type": "https://sip.coach/entwickler/api/fehler#owner"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The team's owner cannot have their role changed or be removed through this API. / This member is the team's only active `admin`; changing their role or removing them would leave the team without one.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Change a member's role",
        "tags": [
          "Write"
        ],
        "x-scope": "users:write"
      }
    },
    "/api/public/v1/webhook-deliveries/{delivery_id}/retry": {
      "post": {
        "description": "Retries a failed or given-up delivery now, instead of waiting for the next scheduled attempt. 404 for a foreign or unknown delivery id.",
        "operationId": "retryWebhookDelivery",
        "parameters": [
          {
            "in": "path",
            "name": "delivery_id",
            "required": true,
            "schema": {
              "title": "Delivery Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDeliveryOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Retry a failed delivery now",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      }
    },
    "/api/public/v1/webhook-endpoints": {
      "get": {
        "description": "Webhook endpoints of the calling tenant. `secret` is never included (only the response to `POST` carries it, once).",
        "operationId": "listWebhookEndpoints",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointsPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List webhook endpoints",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      },
      "post": {
        "description": "The target URL must be HTTPS and publicly routable. ``secret`` is returned only in this response — it is never shown again.",
        "operationId": "createWebhookEndpoint",
        "parameters": [
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "description": "Production",
                "events": [
                  "training.completed",
                  "evaluation.completed"
                ],
                "url": "https://example.com/webhooks/sip-coach"
              },
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointCreatedOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Create a webhook endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      }
    },
    "/api/public/v1/webhook-endpoints/{endpoint_id}": {
      "delete": {
        "description": "Deletes the endpoint; queued deliveries for it are dropped. 404 for a foreign or unknown id.",
        "operationId": "deleteWebhookEndpoint",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "example": {
                  "ok": true
                },
                "schema": {
                  "properties": {
                    "ok": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "ok"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete a webhook endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      },
      "patch": {
        "description": "Updates `url`, `description`, `events` and/or `status`. 404 for a foreign or unknown id.",
        "operationId": "updateWebhookEndpoint",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "status": "active"
              },
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Update a webhook endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      }
    },
    "/api/public/v1/webhook-endpoints/{endpoint_id}/deliveries": {
      "get": {
        "description": "The most recent delivery attempts for one endpoint, newest first. 404 for a foreign or unknown endpoint id.",
        "operationId": "listWebhookDeliveries",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDeliveriesPage"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "List recent deliveries of an endpoint",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      }
    },
    "/api/public/v1/webhook-endpoints/{endpoint_id}/test": {
      "post": {
        "description": "Queues a single ``ping`` event for delivery by the background delivery loop (picked up within seconds); the outcome appears in ``GET .../deliveries`` under the returned ``delivery_id``.",
        "operationId": "testWebhookEndpoint",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "description": "Any BCP 47 language tag (e.g. `en`, `en-US`, `de-DE`). A tag starting with `en` selects English for the `title` of error bodies and catalog labels (not response field names, which stay as documented here); anything else, including no header at all, falls back to German.",
            "example": "en-US",
            "in": "header",
            "name": "Accept-Language",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "A UUID to correlate this call with your own logs; echoed back unchanged. A new one is generated if this header is missing or not a UUID.",
            "in": "header",
            "name": "X-Request-Id",
            "required": false,
            "schema": {
              "format": "uuid",
              "type": "string"
            }
          },
          {
            "description": "Up to 100 characters, valid 24h. Replaying the same key with the same body returns the first call's response again without repeating the action; the same key with a different body returns `422 idempotency_mismatch`.",
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "maxLength": 100,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookTestOut"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unauthorized",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 401,
                  "title": "Unauthorized",
                  "type": "https://sip.coach/entwickler/api/fehler#unauthorized"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is missing, unknown, malformed, expired, revoked, or the caller's IP is not on its allowlist. One code for every reason on purpose — the real reason is in the tenant's own audit log, never in this response.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "api_disabled": {
                    "summary": "Interface disabled",
                    "value": {
                      "code": "api_disabled",
                      "detail": "suspended",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 403,
                      "title": "Interface disabled",
                      "type": "https://sip.coach/entwickler/api/fehler#api_disabled"
                    }
                  },
                  "insufficient_scope": {
                    "summary": "Insufficient scope",
                    "value": {
                      "code": "insufficient_scope",
                      "detail": "scope 'assignments:write' required",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "required_scope": "assignments:write",
                      "status": 403,
                      "title": "Insufficient scope",
                      "type": "https://sip.coach/entwickler/api/fehler#insufficient_scope"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The key is valid but lacks a scope this operation requires; `detail` names it. / The tenant is suspended or blocked.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "not_found",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 404,
                  "title": "Not found",
                  "type": "https://sip.coach/entwickler/api/fehler#not_found"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Either the id never existed, or it belongs to a different tenant — both look identical from the outside.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/problem+json": {
                "examples": {
                  "idempotency_mismatch": {
                    "summary": "Idempotency key already used with a different body",
                    "value": {
                      "code": "idempotency_mismatch",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Idempotency key already used with a different body",
                      "type": "https://sip.coach/entwickler/api/fehler#idempotency_mismatch"
                    }
                  },
                  "validation_error": {
                    "summary": "Validation error",
                    "value": {
                      "code": "validation_error",
                      "detail": "request validation failed",
                      "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                      "status": 422,
                      "title": "Validation error",
                      "type": "https://sip.coach/entwickler/api/fehler#validation_error"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "A query, path or body value failed validation; see `detail`/`errors` for which field. / The `Idempotency-Key` header was reused with a different request body than its first use.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "rate_limited",
                  "detail": "rate limit exceeded",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "retry_after": 42,
                  "status": 429,
                  "title": "Too many requests",
                  "type": "https://sip.coach/entwickler/api/fehler#rate_limited"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "Per-key or per-tenant rate limit exceeded; `Retry-After` names the number of seconds to wait.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/problem+json": {
                "example": {
                  "code": "unavailable",
                  "request_id": "a7e8b2c1-4d3e-4f5a-9b6c-7d8e9f0a1b2c",
                  "status": 503,
                  "title": "Temporarily unavailable",
                  "type": "https://sip.coach/entwickler/api/fehler#unavailable"
                },
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            },
            "description": "The customer API is temporarily unavailable; retry later.",
            "headers": {
              "RateLimit-Limit": {
                "description": "The tighter of the per-key and per-tenant limit.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Unix timestamp when the window resets.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-Id": {
                "description": "Echoes the request's `X-Request-Id`, or a new one.",
                "schema": {
                  "format": "uuid",
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Send a test event",
        "tags": [
          "Webhooks"
        ],
        "x-scope": "webhooks:manage"
      }
    }
  },
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "servers": [
    {
      "description": "Production",
      "url": "https://app.sip.coach"
    }
  ],
  "tags": [
    {
      "description": "Read-only resources: your tenant, members, trainings, evaluations, assignments, cases, catalog and team analytics.",
      "name": "Read"
    },
    {
      "description": "Writes: invite or change members, create or update assignments and cases, and read synchronized CRM deals and the objection catalog.",
      "name": "Write"
    },
    {
      "description": "Manage webhook endpoints: create, update, delete, send a test event and inspect or retry deliveries.",
      "name": "Webhooks"
    }
  ]
}
