> ## Documentation Index
> Fetch the complete documentation index at: https://docs.steerai.autos/llms.txt
> Use this file to discover all available pages before exploring further.

# API für Teamzusammenarbeit

> Teamverwaltung mit mehreren Nutzern, Einladungen und rollenbasierter Zugriffskontrolle

## Überblick

Die Teamzusammenarbeits-API ermöglicht Autohäusern mit mehreren Nutzern, Teams zu verwalten, Mitglieder einzuladen, Rollen zuzuweisen und Zugriffsrechte zu steuern. Ideal für Organisationen mit mehreren Vertriebsmitarbeitern, Managern und Administratoren.

## Hauptfunktionen

<CardGroup cols={2}>
  <Card title="Teamverwaltung" icon="users">
    Erstellen und verwalten Sie mehrere Teams innerhalb Ihrer Organisation
  </Card>

  <Card title="Mitgliedereinladungen" icon="envelope">
    Laden Sie Teammitglieder per E-Mail mit Rollen zu
  </Card>

  <Card title="Rollenbasierter Zugriff" icon="shield">
    Steuern Sie, worauf Teammitglieder zugreifen und was sie ändern können
  </Card>

  <Card title="Audit-Trail" icon="clock">
    Verfolgen Sie Teamaktivitäten und Mitgliederänderungen
  </Card>
</CardGroup>

## Endpunkte

### Alle Teams auflisten

<ParamField path="GET" type="endpoint">
  /teams
</ParamField>

Ruft alle Teams mit optionaler Filterung und Sortierung ab.

**Query-Parameter:**

<ParamField query="search" type="string">
  Suche nach Teamname oder Slug
</ParamField>

<ParamField query="ownerId" type="string">
  Filter nach Team-Owner-ID
</ParamField>

<ParamField query="sortBy" type="enum">
  Sortierfeld: `name`, `createdAt` (Standard: name)
</ParamField>

<ParamField query="sortOrder" type="enum">
  Sortierrichtung: `asc` (Standard), `desc`
</ParamField>

**Antwort:**

```json theme={null}
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Downtown Dealership",
    "slug": "downtown-dealership",
    "ownerId": "owner_uuid",
    "createdAt": "2024-01-15T10:30:00Z",
    "owner": {
      "id": "owner_uuid",
      "name": "John Doe",
      "email": "john@dealership.com"
    },
    "memberCount": 12,
    "roleCount": 4,
    "invitationCount": 2
  }
]
```

***

### Meine Teams abrufen

<ParamField path="GET" type="endpoint">
  /teams/my
</ParamField>

Ruft alle Teams ab, in denen der aktuelle Nutzer Mitglied oder Team-Owner ist.

**Antwort:**

Array von Teamobjekten, in denen der Nutzer Mitglied ist.

***

### Team nach ID abrufen

<ParamField path="GET" type="endpoint">
  /teams/{id}
</ParamField>

Ruft detaillierte Informationen zu einem bestimmten Team ab.

**Path-Parameter:**

<ParamField path="id" type="string" required>
  Team-UUID
</ParamField>

**Query-Parameter:**

<ParamField query="includeDetails" type="boolean">
  Mitglieder, Rollen und ausstehende Einladungen einbeziehen (Standard: false)
</ParamField>

**Antwort:**

```json theme={null}
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Downtown Dealership",
  "slug": "downtown-dealership",
  "ownerId": "owner_uuid",
  "createdAt": "2024-01-15T10:30:00Z",
  "owner": {
    "id": "owner_uuid",
    "name": "John Doe",
    "email": "john@dealership.com"
  },
  "members": [
    {
      "id": "member_uuid",
      "name": "Jane Smith",
      "email": "jane@dealership.com",
      "image": "https://...",
      "createdAt": "2024-01-15T10:30:00Z",
      "role": {
        "id": "role_uuid",
        "name": "Sales Manager",
        "permissions": ["view_inventory", "edit_inventory", "view_analytics"]
      },
      "isOwner": false
    }
  ],
  "memberCount": 12,
  "roleCount": 4,
  "invitationCount": 2
}
```

***

### Team nach Slug abrufen

<ParamField path="GET" type="endpoint">
  /teams/slug/{slug}
</ParamField>

Ruft Teaminformationen über den URL-freundlichen Slug ab.

**Path-Parameter:**

<ParamField path="slug" type="string" required>
  Team-Slug (z. B. "downtown-dealership")
</ParamField>

***

### Team erstellen

<ParamField path="POST" type="endpoint">
  /teams
</ParamField>

Erstellt ein neues Team. Der authentifizierte Nutzer wird Team-Owner.

**Anfrage-Body:**

```json theme={null}
{
  "name": "North Branch Dealership",
  "slug": "north-branch"
}
```

<ParamField body="name" type="string" required>
  Anzeigename des Teams (max. 100 Zeichen)
</ParamField>

<ParamField body="slug" type="string" required>
  URL-freundlicher Bezeichner (nur Kleinbuchstaben, Zahlen, Bindestriche; max. 50 Zeichen)
</ParamField>

**Antwort:**

```json theme={null}
{
  "id": "new_team_uuid",
  "name": "North Branch Dealership",
  "slug": "north-branch",
  "ownerId": "current_user_uuid",
  "createdAt": "2024-01-17T11:00:00Z"
}
```

***

### Team aktualisieren

<ParamField path="PATCH" type="endpoint">
  /teams/{id}
</ParamField>

Aktualisiert Teaminformationen. Nur der Team-Owner kann Teamdetails ändern.

**Path-Parameter:**

<ParamField path="id" type="string" required>
  Team-UUID
</ParamField>

**Anfrage-Body:**

```json theme={null}
{
  "name": "North Branch Dealership - Updated",
  "slug": "north-branch-updated"
}
```

***

### Team löschen

<ParamField path="DELETE" type="endpoint">
  /teams/{id}
</ParamField>

Löscht ein Team. Nur der Team-Owner kann ein Team löschen, und es darf keine aktiven Mitglieder haben (außer dem Team-Owner).

**Path-Parameter:**

<ParamField path="id" type="string" required>
  Team-UUID
</ParamField>

<Warning>
  Teams mit aktiven Mitgliedern können nicht gelöscht werden. Entfernen Sie zuerst alle Mitglieder oder übertragen Sie den Besitz.
</Warning>

***

### Teammitglied einladen

<ParamField path="POST" type="endpoint">
  /teams/{teamId}/invite
</ParamField>

Lädt einen Nutzer mit einer bestimmten Rolle in das Team ein.

**Path-Parameter:**

<ParamField path="teamId" type="string" required>
  Team-UUID
</ParamField>

**Anfrage-Body:**

```json theme={null}
{
  "email": "newmember@dealership.com",
  "roleId": "role_uuid"
}
```

<ParamField body="email" type="string" required>
  E-Mail-Adresse des einzuladenden Nutzers
</ParamField>

<ParamField body="roleId" type="string" required>
  Rollen-UUID für das Mitglied
</ParamField>

**Antwort:**

```json theme={null}
{
  "id": "invitation_uuid",
  "teamId": "team_uuid",
  "userId": "invited_user_uuid",
  "email": "newmember@dealership.com",
  "roleId": "role_uuid",
  "token": "invitation_token",
  "expiresAt": "2024-01-24T11:00:00Z",
  "user": {
    "id": "invited_user_uuid",
    "name": "New Member",
    "email": "newmember@dealership.com"
  },
  "role": {
    "id": "role_uuid",
    "name": "Salesperson"
  }
}
```

<Info>
  Der eingeladene Nutzer erhält eine E-Mail mit Einladungslink. Die Einladung verfällt nach 7 Tagen.
</Info>

***

### Teameinladung annehmen

<ParamField path="POST" type="endpoint">
  /teams/accept-invitation
</ParamField>

Nimmt eine Teameinladung mit dem Token aus der Einladungs-E-Mail an.

**Anfrage-Body:**

```json theme={null}
{
  "token": "invitation_token_from_email"
}
```

<ParamField body="token" type="string" required>
  Einladungs-Token
</ParamField>

**Antwort:**

```json theme={null}
{
  "id": "membership_uuid",
  "teamId": "team_uuid",
  "userId": "user_uuid",
  "roleId": "role_uuid",
  "team": {
    "id": "team_uuid",
    "name": "Downtown Dealership",
    "slug": "downtown-dealership"
  },
  "role": {
    "id": "role_uuid",
    "name": "Salesperson",
    "permissions": ["view_inventory", "create_leads"]
  }
}
```

***

### Teammitglieder abrufen

<ParamField path="GET" type="endpoint">
  /teams/{teamId}/members
</ParamField>

Ruft alle Mitglieder eines Teams mit Rollen und Berechtigungen ab.

**Path-Parameter:**

<ParamField path="teamId" type="string" required>
  Team-UUID
</ParamField>

**Antwort:**

```json theme={null}
[
  {
    "id": "member_uuid",
    "name": "Jane Smith",
    "email": "jane@dealership.com",
    "image": "https://...",
    "createdAt": "2024-01-15T10:30:00Z",
    "role": {
      "id": "role_uuid",
      "name": "Sales Manager",
      "permissions": [
        "view_inventory",
        "edit_inventory",
        "delete_inventory",
        "view_analytics",
        "manage_leads",
        "invite_members"
      ]
    },
    "isOwner": false
  }
]
```

***

### Ausstehende Einladungen abrufen

<ParamField path="GET" type="endpoint">
  /teams/{teamId}/invitations
</ParamField>

Ruft alle ausstehenden (noch nicht angenommenen) Einladungen eines Teams ab.

**Path-Parameter:**

<ParamField path="teamId" type="string" required>
  Team-UUID
</ParamField>

**Antwort:**

```json theme={null}
[
  {
    "id": "invitation_uuid",
    "teamId": "team_uuid",
    "email": "pending@dealership.com",
    "roleId": "role_uuid",
    "expiresAt": "2024-01-24T11:00:00Z",
    "user": {
      "id": "user_uuid",
      "name": "Pending User",
      "email": "pending@dealership.com"
    },
    "role": {
      "id": "role_uuid",
      "name": "Salesperson"
    }
  }
]
```

***

### Teammitglied entfernen

<ParamField path="DELETE" type="endpoint">
  /teams/{teamId}/members/{memberId}
</ParamField>

Entfernt ein Mitglied aus dem Team. Erfordert entsprechende Berechtigungen.

**Path-Parameter:**

<ParamField path="teamId" type="string" required>
  Team-UUID
</ParamField>

<ParamField path="memberId" type="string" required>
  Nutzer-ID des zu entfernenden Mitglieds
</ParamField>

**Antwort:**

```json theme={null}
{
  "success": true,
  "message": "Member removed from team successfully"
}
```

<Warning>
  Der Team-Owner kann nicht entfernt werden. Übertragen Sie zuerst den Besitz, falls nötig.
</Warning>

***

### Einladung stornieren

<ParamField path="DELETE" type="endpoint">
  /teams/invitations/{invitationId}/cancel
</ParamField>

Storniert eine ausstehende Teameinladung.

**Path-Parameter:**

<ParamField path="invitationId" type="string" required>
  Einladungs-UUID
</ParamField>

**Antwort:**

```json theme={null}
{
  "success": true,
  "message": "Invitation cancelled successfully"
}
```

***

### Teams eines Nutzers abrufen

<ParamField path="GET" type="endpoint">
  /teams/user/{userId}
</ParamField>

Ruft alle Teams ab, die einem bestimmten Nutzer zugeordnet sind.

**Path-Parameter:**

<ParamField path="userId" type="string" required>
  Nutzer-UUID
</ParamField>

***

## Teamrollen & Berechtigungen

### Standardrollen

| Rolle           | Berechtigungen                              | Beschreibung                                    |
| --------------- | ------------------------------------------- | ----------------------------------------------- |
| **Owner**       | Alle Berechtigungen                         | Vollständige Kontrolle über Team und Ressourcen |
| **Admin**       | Alle außer Teamlöschung                     | Mitglieder, Bestand und Einstellungen verwalten |
| **Manager**     | Bestand ansehen/bearbeiten, Analytik, Leads | Vertriebsleitung mit Reporting-Zugriff          |
| **Salesperson** | Bestand ansehen, Leads erstellen/bearbeiten | Vertriebsmitarbeiter an vorderster Front        |
| **Viewer**      | Nur Leserechte                              | Nur lesender Zugriff auf Bestand und Reports    |

### Berechtigungssystem

Häufige Berechtigungen:

* `view_inventory` - Fahrzeuge und Inserate ansehen
* `edit_inventory` - Fahrzeuginformationen ändern
* `delete_inventory` - Fahrzeuge entfernen
* `create_leads` - Neue Leads erstellen
* `manage_leads` - Alle Leads bearbeiten und löschen
* `view_analytics` - Zugriff auf Dashboard und Reports
* `manage_kpis` - KPI-Dashboard konfigurieren
* `invite_members` - Neue Teammitglieder einladen
* `remove_members` - Teammitglieder entfernen
* `manage_roles` - Rollen erstellen und ändern
* `manage_team` - Teameinstellungen bearbeiten

## Anwendungsfälle

### Beispiel 1: Autohaus-Team erstellen

```bash theme={null}
# Create team
curl -X POST "https://api.steerai.autos/v1/teams" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Prime Auto Group",
    "slug": "prime-auto-group"
  }'
```

### Beispiel 2: Vertriebsteam einladen

```bash theme={null}
# Invite salesperson
curl -X POST "https://api.steerai.autos/v1/teams/{teamId}/invite" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "salesperson@dealership.com",
    "roleId": "salesperson_role_uuid"
  }'
```

### Beispiel 3: Teamaktivität überwachen

```bash theme={null}
# Get team members
curl -X GET "https://api.steerai.autos/v1/teams/{teamId}/members" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Get pending invitations
curl -X GET "https://api.steerai.autos/v1/teams/{teamId}/invitations" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

## Fehlercodes

| Code                       | Status | Beschreibung                                            |
| -------------------------- | ------ | ------------------------------------------------------- |
| `TEAM_NOT_FOUND`           | 404    | Team-ID existiert nicht                                 |
| `SLUG_ALREADY_EXISTS`      | 400    | Team-Slug ist bereits vergeben                          |
| `NOT_TEAM_OWNER`           | 403    | Nur der Team-Owner kann diese Aktion ausführen          |
| `INSUFFICIENT_PERMISSIONS` | 403    | Nutzer hat nicht die erforderlichen Berechtigungen      |
| `ALREADY_TEAM_MEMBER`      | 400    | Nutzer ist bereits Mitglied                             |
| `INVITATION_EXPIRED`       | 400    | Einladungs-Token ist abgelaufen                         |
| `INVITATION_NOT_FOUND`     | 404    | Einladung existiert nicht                               |
| `CANNOT_REMOVE_OWNER`      | 400    | Team-Owner kann nicht entfernt werden                   |
| `TEAM_HAS_MEMBERS`         | 400    | Team mit aktiven Mitgliedern kann nicht gelöscht werden |

## Bewährte Praktiken

<AccordionGroup>
  <Accordion title="Aussagekräftige Teamnamen und Slugs verwenden">
    Wählen Sie klare, professionelle Namen. Slugs sollten URL-freundlich und einprägsam sein.
  </Accordion>

  <Accordion title="Rollenbasierte Zugriffskontrolle implementieren">
    Weisen Sie passende Rollen anhand der Aufgaben zu. Nicht allen Admin-Rechte geben.
  </Accordion>

  <Accordion title="Teammitgliedschaft regelmäßig prüfen">
    Prüfen Sie Teammitglieder quartalsweise. Entfernen Sie inaktive Nutzer und aktualisieren Sie Rollen.
  </Accordion>

  <Accordion title="Erinnerungen zur Einladungsfrist setzen">
    Erinnern Sie an ausstehende Einladungen, bevor sie ablaufen (7 Tage).
  </Accordion>

  <Accordion title="Benutzerdefinierte Rollen dokumentieren">
    Dokumentieren Sie Berechtigungen benutzerdefinierter Rollen klar für Ihr Team.
  </Accordion>

  <Accordion title="Team-Slugs für Routing nutzen">
    Nutzen Sie Team-Slugs in URLs für saubere, teilbare Links.
  </Accordion>
</AccordionGroup>

## Integrationsmuster

### Mandantenfähige Architektur

```javascript theme={null}
// Check user's team membership
async function getUserTeams(userId) {
  const response = await fetch(
    `https://api.steerai.autos/v1/teams/user/${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );
  return response.json();
}

// Filter data by team context
async function getTeamInventory(teamId) {
  const response = await fetch(
    `https://api.steerai.autos/v1/vehicles?teamId=${teamId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );
  return response.json();
}
```

### Berechtigungsprüfung

```javascript theme={null}
function hasPermission(member, permission) {
  return member.role.permissions.includes(permission) || member.isOwner;
}

// Usage
if (hasPermission(currentMember, 'edit_inventory')) {
  // Show edit controls
}
```

## Verwandte Ressourcen

<CardGroup cols={2}>
  <Card title="Authentifizierungs-API" icon="key" href="/de/api-reference/auth/authentication">
    Benutzerauthentifizierung und Sitzungsverwaltung
  </Card>

  <Card title="Rollen & Berechtigungen" icon="shield-halved" href="/de/guides/roles-permissions">
    Leitfaden zum Berechtigungssystem
  </Card>

  <Card title="Multi-Tenant-Setup" icon="building" href="/de/guides/multi-tenant">
    Bewährte Praktiken für Autohausgruppen mit mehreren Standorten
  </Card>

  <Card title="Sicherheitsleitfaden" icon="lock" href="/de/guides/security">
    Sicherheits-Best-Practices für Teams
  </Card>
</CardGroup>
