> ## 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 de collaboration d'équipe

> Gestion multi-utilisateurs des equipes, invitations de membres et controle d'acces base sur les roles

## Vue d'ensemble

L'API de collaboration d'equipe permet aux concessions multi-utilisateurs de gerer des equipes, d'inviter des membres, d'assigner des roles et de controler les autorisations d'acces. Ideale pour les organisations avec plusieurs vendeurs, managers et administrateurs.

## Fonctionnalites cles

<CardGroup cols={2}>
  <Card title="Gestion d'equipe" icon="users">
    Creer et gerer plusieurs equipes au sein de votre organisation
  </Card>

  <Card title="Invitations de membres" icon="envelope">
    Inviter des membres par email avec attribution de roles
  </Card>

  <Card title="Acces base sur les roles" icon="shield">
    Controler ce que les membres peuvent consulter et modifier
  </Card>

  <Card title="Journal d'audit" icon="clock">
    Suivre les activites d'equipe et les changements de membres
  </Card>
</CardGroup>

## Endpoints

### Lister toutes les equipes

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

Recuperer toutes les equipes avec filtrage et tri optionnels.

**Parametres de requete :**

<ParamField query="search" type="string">
  Rechercher par nom d'equipe ou slug
</ParamField>

<ParamField query="ownerId" type="string">
  Filtrer par ID du proprietaire de l'equipe
</ParamField>

<ParamField query="sortBy" type="enum">
  Champ de tri : `name`, `createdAt` (defaut : name)
</ParamField>

<ParamField query="sortOrder" type="enum">
  Sens du tri : `asc` (defaut), `desc`
</ParamField>

**Reponse :**

```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
  }
]
```

***

### Obtenir mes equipes

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

Recuperer toutes les equipes dont l'utilisateur courant est membre ou proprietaire.

**Reponse :**

Tableau d'objets equipe ou l'utilisateur est membre.

***

### Obtenir une equipe par ID

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

Recuperer les informations detaillees d'une equipe specifique.

**Parametres de chemin :**

<ParamField path="id" type="string" required>
  UUID de l'equipe
</ParamField>

**Parametres de requete :**

<ParamField query="includeDetails" type="boolean">
  Inclure les membres, roles et invitations en attente (defaut : false)
</ParamField>

**Reponse :**

```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
}
```

***

### Obtenir une equipe par slug

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

Recuperer les informations d'une equipe via son slug URL.

**Parametres de chemin :**

<ParamField path="slug" type="string" required>
  Slug d'equipe (ex. "downtown-dealership")
</ParamField>

***

### Creer une equipe

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

Creer une nouvelle equipe. L'utilisateur authentifie devient proprietaire de l'equipe.

**Corps de requete :**

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

<ParamField body="name" type="string" required>
  Nom d'affichage de l'equipe (max 100 caracteres)
</ParamField>

<ParamField body="slug" type="string" required>
  Identifiant URL (minuscules, chiffres, tirets uniquement, max 50 caracteres)
</ParamField>

**Reponse :**

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

***

### Mettre a jour une equipe

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

Mettre a jour les informations d'equipe. Seul le proprietaire peut modifier les details.

**Parametres de chemin :**

<ParamField path="id" type="string" required>
  UUID de l'equipe
</ParamField>

**Corps de requete :**

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

***

### Supprimer une equipe

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

Supprimer une equipe. Seul le proprietaire peut supprimer l'equipe, et elle ne doit pas avoir de membres actifs (sauf le proprietaire).

**Parametres de chemin :**

<ParamField path="id" type="string" required>
  UUID de l'equipe
</ParamField>

<Warning>
  Impossible de supprimer une equipe avec des membres actifs. Retirez d'abord tous les membres ou transferez la propriete.
</Warning>

***

### Inviter un membre de l'equipe

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

Inviter un utilisateur a rejoindre l'equipe avec un role specifique.

**Parametres de chemin :**

<ParamField path="teamId" type="string" required>
  UUID de l'equipe
</ParamField>

**Corps de requete :**

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

<ParamField body="email" type="string" required>
  Adresse email de l'utilisateur a inviter
</ParamField>

<ParamField body="roleId" type="string" required>
  UUID du role a attribuer au membre
</ParamField>

**Reponse :**

```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>
  L'utilisateur invite recevra un email avec un lien d'invitation. L'invitation expire apres 7 jours.
</Info>

***

### Accepter une invitation d'equipe

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

Accepter une invitation d'equipe en utilisant le token recu par email.

**Corps de requete :**

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

<ParamField body="token" type="string" required>
  Token d'invitation
</ParamField>

**Reponse :**

```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"]
  }
}
```

***

### Obtenir les membres de l'equipe

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

Recuperer tous les membres d'une equipe avec leurs roles et autorisations.

**Parametres de chemin :**

<ParamField path="teamId" type="string" required>
  UUID de l'equipe
</ParamField>

**Reponse :**

```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
  }
]
```

***

### Obtenir les invitations en attente

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

Recuperer toutes les invitations en attente (non acceptees) pour une equipe.

**Parametres de chemin :**

<ParamField path="teamId" type="string" required>
  UUID de l'equipe
</ParamField>

**Reponse :**

```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"
    }
  }
]
```

***

### Retirer un membre de l'equipe

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

Retirer un membre de l'equipe. Necessite les autorisations appropriees.

**Parametres de chemin :**

<ParamField path="teamId" type="string" required>
  UUID de l'equipe
</ParamField>

<ParamField path="memberId" type="string" required>
  ID de l'utilisateur a retirer
</ParamField>

**Reponse :**

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

<Warning>
  Impossible de retirer le proprietaire de l'equipe. Transferez d'abord la propriete si besoin.
</Warning>

***

### Annuler une invitation

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

Annuler une invitation d'equipe en attente.

**Parametres de chemin :**

<ParamField path="invitationId" type="string" required>
  UUID de l'invitation
</ParamField>

**Reponse :**

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

***

### Obtenir les equipes d'un utilisateur

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

Recuperer toutes les equipes associees a un utilisateur specifique.

**Parametres de chemin :**

<ParamField path="userId" type="string" required>
  UUID de l'utilisateur
</ParamField>

***

## Roles et autorisations d'equipe

### Roles par defaut

| Role            | Autorisations                              | Description                                            |
| --------------- | ------------------------------------------ | ------------------------------------------------------ |
| **Owner**       | Toutes les autorisations                   | Controle total sur l'equipe et toutes les ressources   |
| **Admin**       | Tout sauf suppression d'equipe             | Peut gerer les membres, l'inventaire et les parametres |
| **Manager**     | Voir/Modifier inventaire, Analytics, Leads | Manager commercial avec acces aux rapports             |
| **Salesperson** | Voir inventaire, Creer/Modifier des leads  | Personnel commercial de terrain                        |
| **Viewer**      | Acces en lecture seule                     | Acces en lecture seule a l'inventaire et aux rapports  |

### Systeme d'autorisations

Autorisations courantes :

* `view_inventory` - Voir les vehicules et les annonces
* `edit_inventory` - Modifier les informations vehicule
* `delete_inventory` - Supprimer des vehicules
* `create_leads` - Creer de nouveaux leads
* `manage_leads` - Modifier et supprimer tous les leads
* `view_analytics` - Acceder au tableau de bord et rapports
* `manage_kpis` - Configurer le tableau de bord KPI
* `invite_members` - Inviter de nouveaux membres
* `remove_members` - Retirer des membres
* `manage_roles` - Creer et modifier des roles
* `manage_team` - Modifier les parametres d'equipe

## Cas d'usage

### Exemple 1 : Creer une equipe de concession

```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"
  }'
```

### Exemple 2 : Inviter une equipe commerciale

```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"
  }'
```

### Exemple 3 : Surveiller l'activite d'equipe

```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"
```

## Codes d'erreur

| Code                       | Statut | Description                                                |
| -------------------------- | ------ | ---------------------------------------------------------- |
| `TEAM_NOT_FOUND`           | 404    | L'ID d'equipe n'existe pas                                 |
| `SLUG_ALREADY_EXISTS`      | 400    | Le slug d'equipe est deja utilise                          |
| `NOT_TEAM_OWNER`           | 403    | Seul le proprietaire peut effectuer cette action           |
| `INSUFFICIENT_PERMISSIONS` | 403    | L'utilisateur n'a pas les autorisations requises           |
| `ALREADY_TEAM_MEMBER`      | 400    | L'utilisateur est deja membre                              |
| `INVITATION_EXPIRED`       | 400    | Le token d'invitation a expire                             |
| `INVITATION_NOT_FOUND`     | 404    | L'invitation n'existe pas                                  |
| `CANNOT_REMOVE_OWNER`      | 400    | Impossible de retirer le proprietaire                      |
| `TEAM_HAS_MEMBERS`         | 400    | Impossible de supprimer une equipe avec des membres actifs |

## Bonnes pratiques

<AccordionGroup>
  <Accordion title="Utiliser des noms et slugs d'equipe descriptifs">
    Choisissez des noms clairs et professionnels. Les slugs doivent etre lisibles et memorables.
  </Accordion>

  <Accordion title="Mettre en place un acces base sur les roles">
    Assignez les roles en fonction des fonctions. Ne donnez pas l'acces admin a tout le monde.
  </Accordion>

  <Accordion title="Reviser regulierement la composition des equipes">
    Auditez les membres chaque trimestre. Supprimez les utilisateurs inactifs et mettez a jour les roles.
  </Accordion>

  <Accordion title="Mettre en place des rappels d'expiration d'invitation">
    Relancez les invitations en attente avant leur expiration (7 jours).
  </Accordion>

  <Accordion title="Documenter les roles personnalises">
    Si vous creez des roles personnalises, documentez clairement leurs autorisations.
  </Accordion>

  <Accordion title="Utiliser les slugs d'equipe pour le routage">
    Utilisez les slugs pour des URLs plus propres et plus partageables.
  </Accordion>
</AccordionGroup>

## Modeles d'integration

### Architecture multi-locataires

```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();
}
```

### Verification des autorisations

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

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

## Ressources associees

<CardGroup cols={2}>
  <Card title="API d'authentification" icon="key" href="/fr/api-reference/auth/authentication">
    Authentification des utilisateurs et gestion des sessions
  </Card>

  <Card title="Roles et autorisations" icon="shield-halved" href="/fr/guides/roles-permissions">
    Guide detaille du systeme d'autorisations
  </Card>

  <Card title="Configuration multi-locataire" icon="building" href="/fr/guides/multi-tenant">
    Bonnes pratiques pour les concessions multi-sites
  </Card>

  <Card title="Guide de securite" icon="lock" href="/fr/guides/security">
    Bonnes pratiques de securite pour les equipes
  </Card>
</CardGroup>
