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

# Obter output do agente (linhas de código)

> Consulte as linhas de código inseridas e excluídas pelo agente e aceitas pela sua equipe no Devin Desktop e no Devin CLI, com filtragem, agrupamento e paginação.

<Note>
  Este é um **endpoint v2** que usa autenticação via Bearer token e parâmetros de consulta, diferentemente da Analytics API v1, que usa chaves de serviço no corpo da requisição. Consulte [Autenticação](#authentication) abaixo.
</Note>

<Warning>
  Este endpoint **não** é destinado ao monitoramento de uso em tempo real. Os dados são agregados por hora e o
  limite de taxa de requisições é baixo (10 requisições por hora por equipe). Use-o para relatórios periódicos e exportação em massa.
</Warning>

<h2 id="authentication">
  Autenticação
</h2>

Este endpoint usa autenticação por **Bearer token**. Inclua seu token no header `Authorization`:

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

Use uma chave de API de usuário de serviço do Devin com a permissão **Usar API de análises local** ou uma chave de serviço do Windsurf
com a permissão **Analytics Read**. Consulte
[Autenticação](/pt-BR/desktop/accounts/api-reference/analytics-v2-introduction#authentication) para saber como
criar cada uma delas.

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

O parâmetro de consulta `metric` é obrigatório e recebe uma lista separada por vírgulas com as métricas a serem retornadas.
Cada métrica solicitada aparece como um campo inteiro em todas as linhas:

| Métrica | Descrição |
| - | - |
| `loc_inserted` | Linhas inseridas pelo agente e aceitas pelo usuário |
| `loc_deleted` | Linhas excluídas pelo agente e aceitas pelo usuário |

Por exemplo, `?metric=loc_inserted,loc_deleted` retorna ambas; `?metric=loc_inserted` retorna apenas
`loc_inserted`. Requisições sem `metric` ou com uma métrica desconhecida falham com `400`.

As linhas são contabilizadas quando um usuário aceita uma edição do agente no [Devin Desktop](/pt-BR/desktop/introducing-devin-desktop) ou na
[Devin CLI](/pt-BR/cli), independentemente do modelo. O parâmetro `product` também é obrigatório e, no momento, aceita apenas
`agent`.

<h2 id="grouping-and-granularity">
  Agrupamento e granularidade
</h2>

Use `granularity` e `group_by` para controlar o formato dos dados retornados:

* **Sem granularidade nem agrupamento** — retorna uma única linha agregada para todo o intervalo de datas
* **`granularity=daily`** — cada linha inclui um `timestamp` no formato `YYYY-MM-DD`
* **`granularity=monthly`** — cada linha inclui um `timestamp` no formato `YYYY-MM`
* **`group_by=user`** — cada linha inclui um `user_id` e um `user_email`
* **`group_by=session`** — cada linha inclui um `session_id` (a conversa do Devin Desktop ou a sessão da CLI em que as linhas foram aceitas)
* **`group_by=model_uid`** — cada linha inclui um `model_uid`
* **`group_by=ide`** — cada linha inclui um `ide`
* **`group_by=ide,ide_version`** — cada linha inclui `ide` e `ide_version` (para agrupar por `ide_version`, `ide` também precisa ser incluído)
* **`group_by=os`** — cada linha inclui um `os`, como `darwin` (macOS), `windows` ou `linux`
* **`group_by=source`** — cada linha inclui uma `source`: `CASCADE_CLIENT` para linhas aceitas no Devin Desktop e `CHISEL` para linhas aceitas na Devin CLI (incluindo a CLI executada como agente em outros editores)

É possível combinar dimensões, por exemplo, `group_by=user,source,model_uid`. Aplicam-se os mesmos filtros `models`,
`group_id` e `user_id` de [Get Consumption](/pt-BR/desktop/accounts/api-reference/get-consumption).

<h2 id="pagination">
  Paginação
</h2>

Os resultados são paginados com um tamanho de página padrão de 1.000 linhas (máximo de 10.000). Quando houver mais resultados disponíveis,
a resposta incluirá um `next_page_cursor` no objeto `pagination`. Passe-o no parâmetro de consulta `page_cursor`
para buscar a próxima página, usando a mesma lista de `metric` da requisição original. Os cursores ficam vinculados
ao endpoint e às métricas que os emitiram; um cursor de `/consumption`, ou um emitido para uma lista de `metric`
diferente, é rejeitado com `400`.

Os cursores de página expiram após 24 horas. Uma requisição das páginas seguintes não conta como uma nova consulta no seu limite de taxa de requisições.

<h2 id="rate-limits">
  Limites de taxa de requisições
</h2>

Este endpoint tem um limite de **10 requisições por hora** por equipe. Se você exceder esse limite, o
servidor retornará `429 Too Many Requests` com um header `Retry-After`.

Paginar uma consulta anterior (usando um `next_page_cursor`) **não** conta para esse limite —
apenas a consulta inicial de cada relatório é contabilizada. O limite baixo se deve ao fato de que este endpoint é voltado para
relatórios periódicos, e não para o monitoramento de uso em tempo real.


## OpenAPI

````yaml pt-BR/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: >
    A Analytics API v2 fornece análises de consumo de créditos e ACU, de
    usuários ativos e do output tipado do agente

    (linhas de código aceitas) para equipes Enterprise. Os dados são obtidos de
    agregações por hora

    e oferecem suporte a filtragem flexível, agrupamento e paginação baseada em
    cursor.
servers:
  - url: https://server.codeium.com
security:
  - bearerAuth: []
paths:
  /api/v2alpha/analytics/output:
    get:
      summary: Obter análises do output tipado do agente (linhas de código)
      description: >
        Consulte o output tipado do agente para a equipe autenticada. O
        parâmetro obrigatório `metric` é uma

        lista de métricas separadas por vírgulas a serem retornadas:
        `loc_inserted` e/ou `loc_deleted`, que representam as linhas

        inseridas ou excluídas pelo agente e aceitas pelos usuários no Devin
        Desktop e no Devin CLI.

        Cada métrica solicitada aparece como um campo de número inteiro em cada
        linha. Os resultados são obtidos de dados agregados

        por hora e podem ser filtrados por intervalo de datas, produto, modelo,
        grupo e usuário, e agrupados

        pelas mesmas dimensões do consumo, além de `session` e `source` (Devin
        Desktop ou CLI).


        Esses endpoints foram projetados para relatórios periódicos e exportação
        em massa. **Não** se destinam ao monitoramento de uso em tempo real: os
        dados são agregados por hora e o limite de taxa de requisições é baixo
        (10 requisições por hora por equipe).
      operationId: getOutput
      parameters:
        - name: metric
          in: query
          required: true
          schema:
            type: string
          description: >
            Lista de métricas de output tipado separadas por vírgulas a serem
            retornadas; cada uma aparece como um campo em cada linha. Métricas
            disponíveis:

            - `loc_inserted` — linhas inseridas pelo agente e aceitas pelo
            usuário

            - `loc_deleted` — linhas excluídas pelo agente e aceitas pelo
            usuário
          example: loc_inserted,loc_deleted
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: Início do intervalo de datas (inclusive) no formato `YYYY-MM-DD`.
          example: '2026-06-01T00:00:00.000Z'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: >-
            Fim do intervalo de datas (inclusive) no formato `YYYY-MM-DD`. O
            intervalo não deve exceder 90 dias.
          example: '2026-06-30T00:00:00.000Z'
        - name: product
          in: query
          required: true
          schema:
            type: string
            enum:
              - agent
          description: Produto cujos dados de output tipado serão consultados.
          example: agent
        - name: granularity
          in: query
          required: false
          schema:
            type: string
            enum:
              - daily
              - monthly
          description: >
            Granularidade temporal para agrupar os resultados. Quando
            especificada, cada linha inclui um campo `timestamp`.

            Se omitida, os resultados são agregados para todo o intervalo de
            datas.
        - name: group_by
          in: query
          required: false
          schema:
            type: string
          description: >
            Lista de dimensões separadas por vírgulas para agrupar os
            resultados. Dimensões aceitas:

            - `user` — inclui `user_id` e `user_email` em cada linha

            - `session` — inclui `session_id` em cada linha

            - `model_uid` — inclui `model_uid` em cada linha

            - `ide` — inclui `ide` em cada linha

            - `ide_version` — inclui `ide_version` em cada linha; exige que
            `ide` também seja incluído

            - `os` — inclui `os` em cada linha

            - `source` — inclui `source` em cada linha (`CASCADE_CLIENT` para
            Devin Desktop, `CHISEL` para a Devin CLI)
          example: source,model_uid
        - name: models
          in: query
          required: false
          schema:
            type: string
          description: >-
            Lista de UIDs de modelos, separados por vírgulas, aos quais os
            resultados serão restritos.
          example: claude-4-sonnet,gpt-4.1
        - name: group_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Restringe os resultados aos usuários de um grupo específico. A chave
            de serviço deve ter acesso a esse grupo. Não há suporte para esse
            filtro com chaves de API de usuários de serviço do Devin.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Restringe os resultados a um usuário específico (UID de
            autenticação).
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10000
            default: 1000
          description: Número máximo de linhas a retornar por página.
        - name: page_cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Cursor opaco obtido de `pagination.next_page_cursor` em uma resposta
            anterior, usado para buscar a próxima página. Informe a mesma lista
            de `metric` usada na requisição que gerou o cursor; cursores gerados
            por outros endpoints ou para uma lista de `metric` diferente são
            rejeitados.
      responses:
        '200':
          description: Dados de output tipado retornados com sucesso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
              examples:
                by_source:
                  summary: Linhas de código por dia e por cliente
                  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 agrupado por usuário e modelo
                  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: Parâmetros de requisição inválidos.
          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: Falha na autenticação ou permissões insuficientes.
          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: >-
            O cursor de página fornecido não pertence à equipe autenticada ou ao
            grupo solicitado.
          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étodo HTTP não permitido (somente `GET` é aceito).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Limite de taxa de requisições excedido (10 requisições por hora por
            equipe). A paginação de uma consulta anterior não é contabilizada
            nesse limite.
          headers:
            Retry-After:
              schema:
                type: string
              description: Tempo de espera sugerido antes de tentar novamente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate limit exceeded
        '503':
          description: >-
            O serviço de análises não está disponível (por exemplo, em
            deployments auto-hospedados).
          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 de linhas de dados de output tipado.
        pagination:
          type: object
          properties:
            next_page_cursor:
              type:
                - string
                - 'null'
              description: >
                Cursor opaco para buscar a próxima página de resultados. Use
                esse valor no parâmetro de consulta `page_cursor`

                em uma requisição subsequente. `null` quando não houver mais
                páginas.

                Os cursores de página expiram após 24 horas.
        metadata:
          type: object
          properties:
            data_freshness:
              type: string
              format: date-time
              description: >-
                Registro de data e hora da última atualização dos dados
                subjacentes (truncado para a hora).
            query_time_ms:
              type: integer
              format: int64
              description: Tempo de execução da consulta no servidor, em milissegundos.
            team_id:
              type: string
              description: >-
                O ID da equipe determinado a partir da chave de serviço
                autenticada.
            group_id:
              type: string
              description: >-
                O ID do grupo ao qual os resultados foram restritos. Presente
                apenas quando `group_id` foi fornecido.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Mensagem de erro legível por humanos.
    OutputRow:
      type: object
      properties:
        timestamp:
          type: string
          description: >
            Intervalo de tempo da linha. O formato depende de `granularity`:
            `YYYY-MM-DD` para intervalos diários e `YYYY-MM` para mensais.

            Presente apenas quando `granularity` é especificado.
          examples:
            - '2026-05-01T00:00:00.000Z'
            - 2026-05
        user_id:
          type: string
          description: >-
            Identificador do usuário (UID de autenticação). Presente apenas
            quando `group_by` inclui `user`.
        user_email:
          type: string
          description: >-
            Endereço de e-mail do usuário. Presente apenas quando `group_by`
            inclui `user`.
          examples:
            - alice@example.com
        session_id:
          type: string
          description: >-
            Identificador da conversa do Devin Desktop ou da sessão do Devin
            CLI. Presente apenas quando `group_by` inclui `session`.
        model_uid:
          type: string
          description: >-
            Identificador do modelo. Presente apenas quando `group_by` inclui
            `model_uid`.
          examples:
            - claude-4-sonnet
        ide:
          type: string
          description: Nome da IDE. Presente apenas quando `group_by` inclui `ide`.
          examples:
            - windsurf
            - devin-cli
        ide_version:
          type: string
          description: >-
            Versão da IDE. Presente apenas quando `group_by` inclui
            `ide_version` (que também exige `ide`).
          examples:
            - 1.0.0
        os:
          type: string
          description: >-
            Sistema operacional de origem da requisição. Presente apenas quando
            `group_by` inclui `os`.
          examples:
            - darwin
            - windows
            - linux
        source:
          type: string
          enum:
            - CASCADE_CLIENT
            - CHISEL
          description: >
            Cliente em que as linhas foram aceitas: `CASCADE_CLIENT` para Devin
            Desktop, `CHISEL` para Devin CLI

            (incluindo a CLI executada como agente em outros editores). Presente
            apenas quando `group_by` inclui `source`.
        loc_inserted:
          type: integer
          format: int64
          description: >-
            Linhas inseridas pelo agente e aceitas pelo usuário. Presente apenas
            quando `metric` inclui `loc_inserted`.
        loc_deleted:
          type: integer
          format: int64
          description: >-
            Linhas excluídas pelo agente cuja exclusão foi aceita pelo usuário.
            Presente apenas quando `metric` inclui `loc_deleted`.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Uma service key com permissão **Analytics Read**, enviada como token
        Bearer no header `Authorization`.


        Crie uma service key em [Configurações da
        equipe](https://windsurf.com/team/settings), na seção "Service Keys".

````

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