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

# Obtenir la production de l’agent (lignes de code)

> Interrogez les lignes de code insérées et supprimées par l’agent, puis acceptées par votre Team dans Devin Desktop et la Devin CLI, avec filtrage, regroupement et pagination.

<Note>
  Il s’agit d’un **endpoint v2** qui utilise l’authentification par jeton Bearer et des paramètres de requête, contrairement à l’API d’analyse v1, qui utilise des clés de service dans le corps de la requête. Consultez la section [Authentification](#authentication) ci-dessous.
</Note>

<Warning>
  Cet endpoint n’est **pas** conçu pour suivre l’utilisation en temps réel. Les données sont agrégées par heure et la
  limite de débit est faible (10 requêtes par heure et par Team). Utilisez-le plutôt pour des rapports périodiques et des exports en masse.
</Warning>

<h2 id="authentication">
  Authentification
</h2>

Cet endpoint utilise l'authentification par **jeton Bearer**. Ajoutez votre token dans l'en-tête `Authorization` :

```
Authorization: Bearer <your_token>
```

Utilisez soit une API key d’utilisateur de service Devin disposant de l’autorisation **Use Local Analytics API**, soit une clé de service Windsurf
disposant de l’autorisation **Analytics Read**. Consultez la section
[Authentification](/fr/desktop/accounts/api-reference/analytics-v2-introduction#authentication) pour savoir comment
créer l’une ou l’autre.

<h2 id="metrics">
  Métriques
</h2>

Le paramètre de requête `metric` est obligatoire et accepte la liste des métriques à renvoyer, séparées par des virgules.
Chaque métrique demandée apparaît sous forme de champ entier dans chaque ligne :

| Métrique | Description |
| - | - |
| `loc_inserted` | Lignes insérées par l'agent et acceptées par l'utilisateur |
| `loc_deleted` | Lignes supprimées par l'agent et acceptées par l'utilisateur |

Par exemple, `?metric=loc_inserted,loc_deleted` renvoie les deux ; `?metric=loc_inserted` renvoie uniquement
`loc_inserted`. Les requêtes sans `metric` ou indiquant une métrique inconnue échouent avec une erreur `400`.

Les lignes sont comptabilisées lorsqu'un utilisateur accepte une modification de l'agent dans [Devin Desktop](/fr/desktop/introducing-devin-desktop) ou dans
[Devin CLI](/fr/cli), quel que soit le modèle utilisé. Le paramètre `product` est également obligatoire et n'accepte actuellement que la valeur
`agent`.

<h2 id="grouping-and-granularity">
  Regroupement et granularité
</h2>

Utilisez `granularity` et `group_by` pour contrôler la structure des données renvoyées :

* **Sans granularité ni regroupement** — renvoie une seule ligne agrégée pour l'ensemble de la plage de dates
* **`granularity=daily`** — chaque ligne inclut un `timestamp` au format `YYYY-MM-DD`
* **`granularity=monthly`** — chaque ligne inclut un `timestamp` au format `YYYY-MM`
* **`group_by=user`** — chaque ligne inclut un `user_id` et un `user_email`
* **`group_by=session`** — chaque ligne inclut un `session_id` (la conversation Devin Desktop ou la session CLI dans laquelle les lignes ont été acceptées)
* **`group_by=model_uid`** — chaque ligne inclut un `model_uid`
* **`group_by=ide`** — chaque ligne inclut un `ide`
* **`group_by=ide,ide_version`** — chaque ligne inclut `ide` et `ide_version` (le regroupement par `ide_version` exige d'inclure également `ide`)
* **`group_by=os`** — chaque ligne inclut un `os`, par exemple `darwin` (macOS), `windows` ou `linux`
* **`group_by=source`** — chaque ligne inclut une `source` : `CASCADE_CLIENT` pour les lignes acceptées dans Devin Desktop, `CHISEL` pour les lignes acceptées dans la Devin CLI (y compris lorsque la CLI s'exécute en tant qu'agent dans d'autres éditeurs)

Les dimensions peuvent être combinées, par exemple `group_by=user,source,model_uid`. Les filtres `models`,
`group_id` et `user_id` s'appliquent de la même manière que pour [Get Consumption](/fr/desktop/accounts/api-reference/get-consumption).

<h2 id="pagination">
  Pagination
</h2>

Les résultats sont paginés avec une taille de page par défaut de 1 000 lignes (maximum 10 000). Lorsque d'autres résultats sont disponibles,
la réponse inclut un `next_page_cursor` dans l'objet `pagination`. Transmettez-le dans le paramètre de requête `page_cursor`
pour récupérer la page suivante, avec la même liste `metric` que dans la requête initiale. Les curseurs sont liés
à l'endpoint et aux métriques pour lesquels ils ont été émis ; un curseur provenant de `/consumption`, ou émis pour une autre liste
`metric`, est rejeté avec une erreur `400`.

Les curseurs de page expirent au bout de 24 heures. Une requête de page suivante n'est pas comptabilisée comme une nouvelle requête dans votre limite de débit.

<h2 id="rate-limits">
  Limites de débit
</h2>

Cet endpoint est limité à **10 requêtes par heure** par team. En cas de dépassement de cette limite, le
serveur renvoie `429 Too Many Requests` avec un en-tête `Retry-After`.

La pagination d'une requête précédente (en suivant un `next_page_cursor`) n'est **pas** prise en compte dans cette limite —
seule la requête initiale de chaque rapport l'est. Cette limite basse s'explique par le fait que cet endpoint est conçu
pour des rapports périodiques, et non pour la surveillance de l'utilisation en temps réel.


## OpenAPI

````yaml fr/desktop/accounts/api-reference/analytics-v2-openapi.yaml GET /api/v2alpha/analytics/output
openapi: 3.1.0
info:
  title: Devin Desktop Analytics API v2
  version: 2.0.0
  description: >
    L’Analytics API v2 fournit des analyses de consommation de crédits et d’ACU,
    des utilisateurs actifs et de la production des agents

    (lignes de code acceptées) pour les Teams Enterprise. Les données
    proviennent d’agrégats horaires et prennent en charge un filtrage flexible,
    le regroupement

    et la pagination par curseur.
servers:
  - url: https://server.codeium.com
security:
  - bearerAuth: []
paths:
  /api/v2alpha/analytics/output:
    get:
      summary: Obtenir les analyses de production de l’agent (lignes de code)
      description: >
        Consultez la production de l’agent pour la Team authentifiée. Le
        paramètre obligatoire `metric` contient une

        liste de métriques à renvoyer, séparées par des virgules :
        `loc_inserted` et/ou `loc_deleted`, qui correspondent aux lignes

        insérées ou supprimées par l’agent et acceptées par les utilisateurs
        dans Devin Desktop et Devin CLI.

        Chaque métrique demandée figure dans un champ de type entier sur chaque
        ligne. Les résultats proviennent d’agrégats

        horaires et peuvent être filtrés par plage de dates, produit, modèle,
        groupe et niveau utilisateur, puis regroupés

        selon les mêmes dimensions que la consommation, auxquelles s’ajoutent
        `session` et `source` (Devin Desktop ou CLI).


        Ces endpoints sont conçus pour les rapports périodiques et l’export en
        masse. Ils ne sont **pas** destinés au suivi de l’utilisation en temps
        réel : les données sont agrégées par heure et la limite de débit est
        faible (10 requêtes par heure et par Team).
      operationId: getOutput
      parameters:
        - name: metric
          in: query
          required: true
          schema:
            type: string
          description: >
            Liste des métriques de production à renvoyer, séparées par des
            virgules ; chaque métrique apparaît sous forme de champ dans chaque
            ligne. Métriques prises en charge :

            - `loc_inserted` — lignes insérées par l’agent et acceptées par
            l’utilisateur

            - `loc_deleted` — lignes supprimées par l’agent et dont la
            suppression a été acceptée par l’utilisateur
          example: loc_inserted,loc_deleted
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: Date de début de la plage (incluse) au format `YYYY-MM-DD`.
          example: '2026-06-01T00:00:00.000Z'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: >-
            Date de fin de la plage (incluse) au format `YYYY-MM-DD`. La plage
            ne doit pas dépasser 90 jours.
          example: '2026-06-30T00:00:00.000Z'
        - name: product
          in: query
          required: true
          schema:
            type: string
            enum:
              - agent
          description: Produit pour lequel récupérer les données de production.
          example: agent
        - name: granularity
          in: query
          required: false
          schema:
            type: string
            enum:
              - daily
              - monthly
          description: >
            Granularité temporelle utilisée pour regrouper les résultats. Si
            elle est spécifiée, chaque ligne inclut un champ `timestamp`.

            Sinon, les résultats sont agrégés sur l’ensemble de la plage de
            dates.
        - name: group_by
          in: query
          required: false
          schema:
            type: string
          description: >
            Liste des dimensions de regroupement des résultats, séparées par des
            virgules. Dimensions prises en charge :

            - `user` — inclut `user_id` et `user_email` dans chaque ligne

            - `session` — inclut `session_id` dans chaque ligne

            - `model_uid` — inclut `model_uid` dans chaque ligne

            - `ide` — inclut `ide` dans chaque ligne

            - `ide_version` — inclut `ide_version` dans chaque ligne ; nécessite
            que `ide` soit également inclus

            - `os` — inclut `os` dans chaque ligne

            - `source` — inclut `source` dans chaque ligne (`CASCADE_CLIENT`
            pour Devin Desktop, `CHISEL` pour Devin CLI)
          example: source,model_uid
        - name: models
          in: query
          required: false
          schema:
            type: string
          description: >-
            Liste des UID de modèles, séparés par des virgules, auxquels limiter
            les résultats.
          example: claude-4-sonnet,gpt-4.1
        - name: group_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Limiter les résultats aux utilisateurs d’un groupe spécifique. La
            clé de service doit avoir accès à ce groupe. Ce filtre n’est pas
            pris en charge avec les API keys d’utilisateurs de service Devin.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Limiter les résultats à un utilisateur spécifique (UID
            d’authentification).
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10000
            default: 1000
          description: Nombre maximal de lignes à renvoyer par page.
        - name: page_cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Curseur opaque issu du champ `pagination.next_page_cursor` d’une
            réponse précédente, permettant de récupérer la page suivante.
            Transmettez la même liste `metric` que dans la requête ayant généré
            ce curseur ; les curseurs générés par d’autres endpoints ou pour une
            liste `metric` différente sont rejetés.
      responses:
        '200':
          description: Données de production renvoyées avec succès.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
              examples:
                by_source:
                  summary: Lignes de code par jour et par client
                  value:
                    data:
                      - timestamp: '2026-06-15T00:00:00.000Z'
                        source: CASCADE_CLIENT
                        loc_inserted: 18420
                        loc_deleted: 3105
                      - timestamp: '2026-06-15T00:00:00.000Z'
                        source: CHISEL
                        loc_inserted: 92310
                        loc_deleted: 11874
                    pagination:
                      next_page_cursor: null
                    metadata:
                      data_freshness: '2026-06-16T03:00:00.000Z'
                      query_time_ms: 1311
                      team_id: team_abc123
                by_user_model:
                  summary: metric=loc_inserted regroupé par utilisateur et par modèle
                  value:
                    data:
                      - user_id: user_abc123
                        user_email: alice@example.com
                        model_uid: claude-4-sonnet
                        loc_inserted: 4210
                    pagination:
                      next_page_cursor: null
                    metadata:
                      data_freshness: '2026-06-16T03:00:00.000Z'
                      query_time_ms: 980
                      team_id: team_abc123
        '400':
          description: Paramètres de requête invalides.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                missing_metric:
                  value:
                    error: metric is required
                bad_metric:
                  value:
                    error: >-
                      unsupported metric: acus (supported: loc_inserted,
                      loc_deleted)
                missing_product:
                  value:
                    error: product is required
                bad_group_by:
                  value:
                    error: 'unsupported group_by dimension for output: foobar'
        '401':
          description: Échec de l’authentification ou autorisations insuffisantes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                missing_auth:
                  value:
                    error: missing Authorization header
                invalid_key:
                  value:
                    error: invalid service key
                insufficient_permissions:
                  value:
                    error: insufficient permissions
        '403':
          description: >-
            Le curseur de pagination fourni n’appartient pas à la Team
            authentifiée ou au groupe demandé.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                cursor_team_mismatch:
                  value:
                    error: page cursor does not belong to this team
        '405':
          description: >-
            Méthode HTTP non autorisée (seule la méthode `GET` est prise en
            charge).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Limite de débit dépassée (10 requêtes par heure et par Team). La
            récupération des pages suivantes d’une requête antérieure n’est pas
            comptabilisée dans cette limite.
          headers:
            Retry-After:
              schema:
                type: string
              description: Délai d’attente recommandé avant de réessayer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate limit exceeded
        '503':
          description: >-
            Le service d’analyse n’est pas disponible (par exemple, dans les
            déploiements auto-hébergés).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    OutputResponse:
      type: object
      required:
        - data
        - pagination
        - metadata
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/OutputRow'
          description: Liste des lignes de données de production.
        pagination:
          type: object
          properties:
            next_page_cursor:
              type:
                - string
                - 'null'
              description: >
                Curseur opaque permettant de récupérer la page suivante de
                résultats. Transmettez cette valeur dans le paramètre de requête
                `page_cursor`

                lors d’une requête ultérieure. Vaut `null` lorsqu’il n’y a plus
                de pages.

                Les curseurs de pagination expirent après 24 heures.
        metadata:
          type: object
          properties:
            data_freshness:
              type: string
              format: date-time
              description: >-
                Horodatage indiquant la dernière actualisation des données
                sous-jacentes (tronqué à l’heure).
            query_time_ms:
              type: integer
              format: int64
              description: Temps d’exécution de la requête côté serveur, en millisecondes.
            team_id:
              type: string
              description: >-
                L’ID de la Team déterminé à partir de la clé de service
                authentifiée.
            group_id:
              type: string
              description: >-
                L’ID du groupe auquel les résultats ont été limités. Présent
                uniquement lorsque `group_id` a été fourni.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Message d’erreur compréhensible par un humain.
    OutputRow:
      type: object
      properties:
        timestamp:
          type: string
          description: >
            Intervalle temporel correspondant à la ligne. Le format dépend de
            `granularity` : `YYYY-MM-DD` pour les intervalles quotidiens,
            `YYYY-MM` pour les intervalles mensuels.

            Présent uniquement lorsque `granularity` est spécifié.
          examples:
            - '2026-05-01T00:00:00.000Z'
            - 2026-05
        user_id:
          type: string
          description: >-
            Identifiant utilisateur (UID d’authentification). Présent uniquement
            lorsque `group_by` inclut `user`.
        user_email:
          type: string
          description: >-
            Adresse e-mail de l’utilisateur. Présente uniquement lorsque
            `group_by` inclut `user`.
          examples:
            - alice@example.com
        session_id:
          type: string
          description: >-
            Identifiant de la conversation Devin Desktop ou de la session Devin
            CLI. Présent uniquement lorsque `group_by` inclut `session`.
        model_uid:
          type: string
          description: >-
            Identifiant du modèle. Présent uniquement lorsque `group_by` inclut
            `model_uid`.
          examples:
            - claude-4-sonnet
        ide:
          type: string
          description: Nom de l’IDE. Présent uniquement lorsque `group_by` inclut `ide`.
          examples:
            - windsurf
            - devin-cli
        ide_version:
          type: string
          description: >-
            Version de l’IDE. Présente uniquement lorsque `group_by` inclut
            `ide_version` (qui nécessite également `ide`).
          examples:
            - 1.0.0
        os:
          type: string
          description: >-
            Système d’exploitation à l’origine de la requête. Présent uniquement
            lorsque `group_by` inclut `os`.
          examples:
            - darwin
            - windows
            - linux
        source:
          type: string
          enum:
            - CASCADE_CLIENT
            - CHISEL
          description: "Client dans lequel les lignes ont été acceptées\_: `CASCADE_CLIENT` pour Devin Desktop, `CHISEL` pour Devin CLI\n(y compris lorsque la CLI s’exécute en tant qu’agent dans d’autres éditeurs). Présent uniquement lorsque `group_by` inclut `source`.\n"
        loc_inserted:
          type: integer
          format: int64
          description: >-
            Lignes insérées par l’agent dont l’insertion a été acceptée au
            niveau utilisateur. Présent uniquement lorsque `metric` inclut
            `loc_inserted`.
        loc_deleted:
          type: integer
          format: int64
          description: >-
            Lignes supprimées par l’agent dont la suppression a été acceptée au
            niveau utilisateur. Présent uniquement lorsque `metric` inclut
            `loc_deleted`.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Une clé de service disposant de l’autorisation **Analytics Read**,
        transmise comme jeton Bearer dans l’en-tête `Authorization`.


        Créez une clé de service dans les paramètres de votre Team, à l’adresse
        [team settings](https://windsurf.com/team/settings), dans la section
        "Service Keys".

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.