> ## 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.

# Ottenere l'output dell'agente (righe di codice)

> Recupera le righe di codice inserite ed eliminate dall'agente e accettate dal tuo team in Devin Desktop e nella Devin CLI, con filtri, raggruppamento e paginazione.

<Note>
  Questo è un **endpoint v2** che usa l'authentication con token Bearer e i parametri di query, a differenza dell'API di analisi v1, che usa le chiavi di servizio nel corpo della richiesta. Consulta la sezione [Authentication](#authentication) più avanti.
</Note>

<Warning>
  Questo endpoint **non** è pensato per il monitoraggio dell'utilizzo in tempo reale. I dati sono aggregati su base oraria e il
  limite di frequenza è basso (10 richieste all'ora per team). Usalo per report periodici ed esportazioni in blocco.
</Warning>

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

Questo endpoint utilizza l'authentication con **token Bearer**. Includi il tuo token nell'header `Authorization`:

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

Usa una API key dell'utente di servizio Devin con l'autorizzazione **Use Local Analytics API** oppure una chiave di servizio Windsurf
con l'autorizzazione **Lettura analytics**. Per sapere come crearle, consulta
[Authentication](/it/desktop/accounts/api-reference/analytics-v2-introduction#authentication).

<h2 id="metrics">
  Metriche
</h2>

Il parametro di query `metric` è obbligatorio e accetta un elenco, separato da virgole, delle metriche da restituire.
Ogni metrica richiesta compare come campo di tipo intero in ogni riga:

| Metrica | Descrizione |
| - | - |
| `loc_inserted` | Righe inserite dall'agente e accettate dall'utente |
| `loc_deleted` | Righe eliminate dall'agente e accettate dall'utente |

Ad esempio, `?metric=loc_inserted,loc_deleted` restituisce entrambe le metriche, mentre `?metric=loc_inserted` restituisce solo
`loc_inserted`. Le richieste prive di `metric` o che specificano una metrica sconosciuta non vanno a buon fine e restituiscono `400`.

Le righe vengono conteggiate quando un utente accetta una modifica dell'agente in [Devin Desktop](/it/desktop/introducing-devin-desktop) o nella
[Devin CLI](/it/cli), indipendentemente dal modello utilizzato. Anche il parametro `product` è obbligatorio e al momento accetta solo
`agent`.

<h2 id="grouping-and-granularity">
  Raggruppamento e granularità
</h2>

Usa `granularity` e `group_by` per controllare la struttura dei dati restituiti:

* **Nessuna granularità o raggruppamento** — restituisce un'unica riga aggregata per l'intero intervallo di date
* **`granularity=daily`** — ogni riga include un `timestamp` in formato `YYYY-MM-DD`
* **`granularity=monthly`** — ogni riga include un `timestamp` in formato `YYYY-MM`
* **`group_by=user`** — ogni riga include `user_id` e `user_email`
* **`group_by=session`** — ogni riga include un `session_id` (la conversazione di Devin Desktop o la sessione della CLI in cui sono state accettate le righe)
* **`group_by=model_uid`** — ogni riga include un `model_uid`
* **`group_by=ide`** — ogni riga include un `ide`
* **`group_by=ide,ide_version`** — ogni riga include `ide` e `ide_version` (per raggruppare per `ide_version` è necessario includere anche `ide`)
* **`group_by=os`** — ogni riga include un `os`, ad esempio `darwin` (macOS), `windows` o `linux`
* **`group_by=source`** — ogni riga include un campo `source`: `CASCADE_CLIENT` per le righe accettate in Devin Desktop, `CHISEL` per le righe accettate nella Devin CLI (inclusa la CLI eseguita come agente all'interno di altri editor)

Le dimensioni possono essere combinate, ad esempio `group_by=user,source,model_uid`. Si applicano gli stessi filtri `models`,
`group_id` e `user_id` di [Get Consumption](/it/desktop/accounts/api-reference/get-consumption).

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

I risultati sono paginati con una dimensione di pagina predefinita di 1.000 righe (massimo 10.000). Quando sono disponibili altri risultati,
la risposta include un `next_page_cursor` nell'oggetto `pagination`. Passalo come parametro di query `page_cursor`
per recuperare la pagina successiva, insieme allo stesso elenco `metric` della richiesta originale. I cursori sono legati
all'endpoint e alle metriche che li hanno generati: un cursore proveniente da `/consumption`, o generato per un elenco `metric`
diverso, viene rifiutato con `400`.

I cursori di pagina scadono dopo 24 ore. Le richieste delle pagine successive non vengono conteggiate come nuove query ai fini del limite di frequenza.

<h2 id="rate-limits">
  Limiti di frequenza
</h2>

Questo endpoint ha un limite di frequenza di **10 richieste all'ora** per team. Se superi questo limite, il
server restituisce `429 Too Many Requests` con un header `Retry-After`.

La paginazione di una query precedente (tramite un `next_page_cursor`) **non** viene conteggiata ai fini di questo limite:
conta solo la query iniziale di ciascun report. Il limite così basso si spiega con il fatto che questo endpoint è pensato per
la reportistica periodica, non per il monitoraggio dell'utilizzo in tempo reale.


## OpenAPI

````yaml it/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'API di analisi v2 fornisce analisi della consumption di crediti e ACU,
    degli utenti attivi e dell'output dell'agente

    (righe di codice accettate) per i team Enterprise. I dati provengono da
    aggregati su base oraria

    e supportano filtri flessibili, raggruppamento e paginazione basata su
    cursore.
servers:
  - url: https://server.codeium.com
security:
  - bearerAuth: []
paths:
  /api/v2alpha/analytics/output:
    get:
      summary: Ottieni analytics sull'output dell'agente (righe di codice)
      description: >
        Recupera l'output dell'agente per il team autenticato. Il parametro
        obbligatorio `metric` è un

        elenco di metriche separate da virgole da restituire: `loc_inserted` e/o
        `loc_deleted`, che indicano le righe

        inserite o eliminate dall'agente e accettate dagli utenti in Devin
        Desktop e nella Devin CLI.

        Ogni metrica richiesta compare in ogni riga come campo di tipo intero. I
        risultati provengono da dati aggregati

        su base oraria e possono essere filtrati per intervallo di date,
        prodotto, modello, gruppo e utente, e raggruppati

        in base alle stesse dimensioni di consumption, oltre a `session` e
        `source` (Devin Desktop o CLI).


        Questi endpoint sono progettati per report periodici ed esportazioni in
        blocco. **Non** sono destinati al monitoraggio dell'utilizzo in tempo
        reale: i dati sono aggregati su base oraria e il limite di frequenza è
        basso (10 richieste all'ora per team).
      operationId: getOutput
      parameters:
        - name: metric
          in: query
          required: true
          schema:
            type: string
          description: >
            Elenco delle metriche di output da restituire, separate da virgole;
            ciascuna compare come campo in ogni riga. Metriche supportate:

            - `loc_inserted` — righe inserite dall'agente e accettate
            dall'utente

            - `loc_deleted` — righe eliminate dall'agente e accettate
            dall'utente
          example: loc_inserted,loc_deleted
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: Data iniziale dell'intervallo (inclusa) nel formato `YYYY-MM-DD`.
          example: '2026-06-01T00:00:00.000Z'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: >-
            Data finale dell'intervallo (inclusa) nel formato `YYYY-MM-DD`.
            L'intervallo non deve superare 90 giorni.
          example: '2026-06-30T00:00:00.000Z'
        - name: product
          in: query
          required: true
          schema:
            type: string
            enum:
              - agent
          description: Prodotto per cui recuperare l'output.
          example: agent
        - name: granularity
          in: query
          required: false
          schema:
            type: string
            enum:
              - daily
              - monthly
          description: >
            Granularità temporale per raggruppare i risultati. Se specificata,
            ogni riga include un campo `timestamp`.

            Se omessa, i risultati vengono aggregati sull'intero intervallo di
            date.
        - name: group_by
          in: query
          required: false
          schema:
            type: string
          description: >
            Elenco delle dimensioni in base alle quali raggruppare i risultati,
            separate da virgole. Dimensioni supportate:

            - `user` — include `user_id` e `user_email` in ogni riga

            - `session` — include `session_id` in ogni riga

            - `model_uid` — include `model_uid` in ogni riga

            - `ide` — include `ide` in ogni riga

            - `ide_version` — include `ide_version` in ogni riga; richiede che
            sia incluso anche `ide`

            - `os` — include `os` in ogni riga

            - `source` — include `source` in ogni riga (`CASCADE_CLIENT` per
            Devin Desktop, `CHISEL` per Devin CLI)
          example: source,model_uid
        - name: models
          in: query
          required: false
          schema:
            type: string
          description: >-
            Elenco degli UID dei modelli a cui limitare i risultati, separati da
            virgole.
          example: claude-4-sonnet,gpt-4.1
        - name: group_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Limita i risultati agli utenti di un gruppo specifico. La chiave di
            servizio deve avere accesso a questo gruppo. Non supportato con le
            API key dell'utente di servizio Devin.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: Limita i risultati a un utente specifico (UID auth).
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10000
            default: 1000
          description: Numero massimo di righe da restituire per pagina.
        - name: page_cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Cursore opaco ottenuto da `pagination.next_page_cursor` di una
            risposta precedente per recuperare la pagina successiva. Passare lo
            stesso elenco `metric` usato nella richiesta che ha generato il
            cursore; i cursori generati da altri endpoint o per un elenco
            `metric` diverso vengono rifiutati.
      responses:
        '200':
          description: Dati di output restituiti correttamente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
              examples:
                by_source:
                  summary: Righe di codice giornaliere per 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 raggruppato per utente e modello
                  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: Parametri della richiesta non validi.
          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: Authentication non riuscita o autorizzazioni insufficienti.
          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: >-
            Il cursore di pagina fornito non appartiene al team autenticato o al
            gruppo richiesto.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                cursor_team_mismatch:
                  value:
                    error: page cursor does not belong to this team
        '405':
          description: Metodo HTTP non consentito (è supportato solo `GET`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Limite di frequenza superato (10 richieste all'ora per team). Il
            recupero di ulteriori pagine di una query precedente non viene
            conteggiato ai fini di questo limite.
          headers:
            Retry-After:
              schema:
                type: string
              description: Tempo di attesa consigliato prima di riprovare.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate limit exceeded
        '503':
          description: >-
            Il servizio di analytics non è disponibile (ad es., nelle
            distribuzioni su infrastruttura propria).
          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: Array di righe di dati restituiti.
        pagination:
          type: object
          properties:
            next_page_cursor:
              type:
                - string
                - 'null'
              description: >
                Cursore opaco per recuperare la pagina successiva dei risultati.
                Passa questo valore come parametro di query `page_cursor`

                in una richiesta successiva. `null` quando non ci sono altre
                pagine.

                I cursori di pagina scadono dopo 24 ore.
        metadata:
          type: object
          properties:
            data_freshness:
              type: string
              format: date-time
              description: >-
                Timestamp dell'ultimo aggiornamento dei dati sottostanti
                (troncato all'ora).
            query_time_ms:
              type: integer
              format: int64
              description: Tempo di esecuzione della query lato server in millisecondi.
            team_id:
              type: string
              description: >-
                L'ID del team determinato in base alla chiave di servizio
                autenticata.
            group_id:
              type: string
              description: >-
                L'ID del gruppo che definisce l'ambito dei risultati. Presente
                solo quando è stato fornito `group_id`.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Messaggio di errore comprensibile all'utente.
    OutputRow:
      type: object
      properties:
        timestamp:
          type: string
          description: >
            Intervallo temporale della riga. Il formato dipende da
            `granularity`: `YYYY-MM-DD` per gli intervalli giornalieri,
            `YYYY-MM` per quelli mensili.

            Presente solo quando è specificato `granularity`.
          examples:
            - '2026-05-01T00:00:00.000Z'
            - 2026-05
        user_id:
          type: string
          description: >-
            Identificatore dell'utente (UID auth). Presente solo quando
            `group_by` include `user`.
        user_email:
          type: string
          description: >-
            Indirizzo email dell'utente. Presente solo quando `group_by` include
            `user`.
          examples:
            - alice@example.com
        session_id:
          type: string
          description: >-
            Identificatore della conversazione di Devin Desktop o della sessione
            di Devin CLI. Presente solo quando `group_by` include `session`.
        model_uid:
          type: string
          description: >-
            Identificatore del modello. Presente solo quando `group_by` include
            `model_uid`.
          examples:
            - claude-4-sonnet
        ide:
          type: string
          description: Nome dell'IDE. Presente solo quando `group_by` include `ide`.
          examples:
            - windsurf
            - devin-cli
        ide_version:
          type: string
          description: >-
            Versione dell'IDE. Presente solo quando `group_by` include
            `ide_version` (che richiede anche `ide`).
          examples:
            - 1.0.0
        os:
          type: string
          description: >-
            Sistema operativo da cui proviene la richiesta. Presente solo quando
            `group_by` include `os`.
          examples:
            - darwin
            - windows
            - linux
        source:
          type: string
          enum:
            - CASCADE_CLIENT
            - CHISEL
          description: >
            Client in cui le righe sono state accettate: `CASCADE_CLIENT` per
            Devin Desktop, `CHISEL` per Devin CLI

            (inclusa la CLI eseguita come agente all'interno di altri editor).
            Presente solo quando `group_by` include `source`.
        loc_inserted:
          type: integer
          format: int64
          description: >-
            Righe inserite dall'agente e accettate dall'utente. Presente solo
            quando `metric` include `loc_inserted`.
        loc_deleted:
          type: integer
          format: int64
          description: >-
            Righe eliminate dall'agente la cui eliminazione è stata accettata
            dall'utente. Presente solo quando `metric` include `loc_deleted`.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Una chiave di servizio con autorizzazione **Analisi Read**, passata come
        token Bearer nell'header `Authorization`.


        Crea una chiave di servizio nelle [impostazioni del
        team](https://windsurf.com/team/settings), nella sezione "Service Keys".

````

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