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

# Obtener la salida del agente (líneas de código)

> Consulta las líneas de código insertadas y eliminadas por el agente y aceptadas por tu equipo en Devin Desktop y Devin CLI, con opciones de filtrado, agrupación y paginación.

<Note>
  Este es un **endpoint v2** que usa autenticación con Bearer token y parámetros de consulta, a diferencia de la Analytics API v1, que usa claves de servicio en el cuerpo de la solicitud. Consulta la sección [Autenticación](#authentication) más abajo.
</Note>

<Warning>
  Este endpoint **no** está pensado para monitorizar el uso en tiempo real. Los datos se agregan por horas y el
  límite de tasa es bajo (10 solicitudes por hora y por equipo). Úsalo para generar informes periódicos y exportaciones masivas.
</Warning>

<h2 id="authentication">
  Autenticación
</h2>

Este endpoint utiliza autenticación mediante **Bearer token**. Incluye tu token en el encabezado `Authorization`:

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

Usa una clave de API de usuario de servicio de Devin con el permiso **Use Local Analytics API** o una clave de servicio de Windsurf
con el permiso **Analytics Read**. Consulta
[Autenticación](/es/desktop/accounts/api-reference/analytics-v2-introduction#authentication) para ver cómo
crear cada una.

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

El parámetro de consulta `metric` es obligatorio y admite una lista separada por comas de las métricas que se deben devolver.
Cada métrica solicitada aparece como un campo de tipo entero en cada fila:

| Métrica | Descripción |
| - | - |
| `loc_inserted` | Líneas insertadas por el agente que el usuario aceptó |
| `loc_deleted` | Líneas eliminadas por el agente que el usuario aceptó |

Por ejemplo, `?metric=loc_inserted,loc_deleted` devuelve ambas; `?metric=loc_inserted` devuelve solo
`loc_inserted`. Las solicitudes que no incluyan `metric` o que indiquen una métrica desconocida fallan con un error `400`.

Las líneas se contabilizan cuando un usuario acepta una edición del agente en [Devin Desktop](/es/desktop/introducing-devin-desktop) o en
[Devin CLI](/es/cli), sea cual sea el modelo. El parámetro `product` también es obligatorio y, por ahora, solo acepta
`agent`.

<h2 id="grouping-and-granularity">
  Agrupación y granularidad
</h2>

Usa `granularity` y `group_by` para controlar la estructura de los datos devueltos:

* **Sin granularidad ni agrupación**: devuelve una única fila agregada para todo el rango de fechas
* **`granularity=daily`**: cada fila incluye un `timestamp` en formato `YYYY-MM-DD`
* **`granularity=monthly`**: cada fila incluye un `timestamp` en formato `YYYY-MM`
* **`group_by=user`**: cada fila incluye un `user_id` y un `user_email`
* **`group_by=session`**: cada fila incluye un `session_id` (la conversación de Devin Desktop o la sesión de la CLI en la que se aceptaron las líneas)
* **`group_by=model_uid`**: cada fila incluye un `model_uid`
* **`group_by=ide`**: cada fila incluye un `ide`
* **`group_by=ide,ide_version`**: cada fila incluye `ide` e `ide_version` (para agrupar por `ide_version` también hay que incluir `ide`)
* **`group_by=os`**: cada fila incluye un `os`, como `darwin` (macOS), `windows` o `linux`
* **`group_by=source`**: cada fila incluye un `source`: `CASCADE_CLIENT` para las líneas aceptadas en Devin Desktop y `CHISEL` para las líneas aceptadas en la Devin CLI (incluida la CLI que se ejecuta como agente dentro de otros editores)

Las dimensiones se pueden combinar; por ejemplo, `group_by=user,source,model_uid`. Se aplican los mismos filtros `models`,
`group_id` y `user_id` que en [Get Consumption](/es/desktop/accounts/api-reference/get-consumption).

<h2 id="pagination">
  Paginación
</h2>

Los resultados se paginan con un tamaño de página predeterminado de 1.000 filas (máximo 10.000). Cuando hay más resultados disponibles,
la respuesta incluye un `next_page_cursor` en el objeto `pagination`. Pásalo como parámetro de consulta `page_cursor`
para obtener la siguiente página, junto con la misma lista de `metric` de la solicitud original. Los cursores están vinculados
al endpoint y a las métricas que los generaron; un cursor de `/consumption`, o uno generado para una lista de `metric`
distinta, se rechaza con un error `400`.

Los cursores de página caducan a las 24 horas. Las solicitudes de páginas sucesivas no cuentan como consultas nuevas a efectos de tu límite de tasa.

<h2 id="rate-limits">
  Límites de tasa
</h2>

Este endpoint tiene un límite de tasa de **10 solicitudes por hora** por equipo. Si superas este límite, el
servidor devuelve `429 Too Many Requests` con un encabezado `Retry-After`.

Paginar una consulta anterior (siguiendo un `next_page_cursor`) **no** cuenta para este límite;
solo cuenta la consulta inicial de cada informe. Este límite es bajo porque el endpoint está pensado para
generar informes periódicos, no para supervisar el uso en tiempo real.


## OpenAPI

````yaml es/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: >
    La Analytics API v2 proporciona analíticas de consumo de créditos y ACU, de
    usuarios activos y de resultados del agente

    (líneas de código aceptadas) para equipos Enterprise.

    Los datos proceden de datos agregados por hora y admite filtros flexibles,
    agrupación

    y paginación basada en cursor.
servers:
  - url: https://server.codeium.com
security:
  - bearerAuth: []
paths:
  /api/v2alpha/analytics/output:
    get:
      summary: Obtener analítica de resultados del agente (líneas de código)
      description: >
        Consulta los resultados del agente para el equipo autenticado. El
        parámetro obligatorio `metric` es una

        lista de las métricas que se devolverán, separadas por comas:
        `loc_inserted` y/o `loc_deleted`, que corresponden a las líneas

        insertadas o eliminadas por el agente y aceptadas por los usuarios en
        Devin Desktop y Devin CLI.

        Cada métrica solicitada aparece como un campo de tipo entero en cada
        fila. Los resultados provienen de datos agregados

        por hora y se pueden filtrar por rango de fechas, producto, modelo,
        grupo y usuario, y agrupar

        por las mismas dimensiones que el consumo, además de `session` y
        `source` (Devin Desktop o CLI).


        Estos endpoints están diseñados para informes periódicos y exportaciones
        masivas. **No** están pensados para supervisar el uso en tiempo real:
        los datos se agregan por hora y el límite de tasa es bajo (10
        solicitudes por hora por equipo).
      operationId: getOutput
      parameters:
        - name: metric
          in: query
          required: true
          schema:
            type: string
          description: >
            Lista de métricas de salida que se devolverán, separadas por comas;
            cada una aparece como un campo en cada fila. Métricas admitidas:

            - `loc_inserted` — líneas insertadas por el agente que el usuario
            aceptó

            - `loc_deleted` — líneas eliminadas por el agente que el usuario
            aceptó
          example: loc_inserted,loc_deleted
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: Fecha de inicio del intervalo (incluida) en formato `YYYY-MM-DD`.
          example: '2026-06-01T00:00:00.000Z'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: >-
            Fecha de fin del intervalo (incluida) en formato `YYYY-MM-DD`. El
            intervalo no debe superar los 90 días.
          example: '2026-06-30T00:00:00.000Z'
        - name: product
          in: query
          required: true
          schema:
            type: string
            enum:
              - agent
          description: Producto cuyos datos de salida se consultarán.
          example: agent
        - name: granularity
          in: query
          required: false
          schema:
            type: string
            enum:
              - daily
              - monthly
          description: >
            Granularidad temporal para agrupar los resultados. Si se especifica,
            cada fila incluye un campo `timestamp`.

            Si se omite, los resultados se agregan para todo el intervalo de
            fechas.
        - name: group_by
          in: query
          required: false
          schema:
            type: string
          description: >
            Lista de dimensiones, separadas por comas, por las que se agruparán
            los resultados. Dimensiones admitidas:

            - `user` — incluye `user_id` y `user_email` en cada fila

            - `session` — incluye `session_id` en cada fila

            - `model_uid` — incluye `model_uid` en cada fila

            - `ide` — incluye `ide` en cada fila

            - `ide_version` — incluye `ide_version` en cada fila; requiere que
            también se incluya `ide`

            - `os` — incluye `os` en cada fila

            - `source` — incluye `source` en cada fila (`CASCADE_CLIENT` para
            Devin Desktop, `CHISEL` para Devin CLI)
          example: source,model_uid
        - name: models
          in: query
          required: false
          schema:
            type: string
          description: >-
            Lista de UID de modelos, separados por comas, a los que se limitarán
            los resultados.
          example: claude-4-sonnet,gpt-4.1
        - name: group_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Filtra los resultados para incluir solo usuarios de un grupo
            específico. La clave de servicio debe tener acceso a este grupo. No
            se admite con claves de API de usuarios de servicio de Devin.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Filtra los resultados para incluir solo un usuario específico (UID
            de autenticación).
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10000
            default: 1000
          description: Número máximo de filas que se devolverán por página.
        - name: page_cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Cursor opaco obtenido del campo `pagination.next_page_cursor` de una
            respuesta anterior para recuperar la siguiente página. Proporcione
            la misma lista de `metric` que en la solicitud que generó el cursor;
            se rechazan los cursores generados por otros endpoints o para una
            lista de `metric` diferente.
      responses:
        '200':
          description: Datos de salida devueltos correctamente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
              examples:
                by_source:
                  summary: Líneas de código diarias 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 usuario y 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 solicitud no vá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: Error de autenticación o permisos 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: >-
            El cursor de página proporcionado no pertenece al equipo autenticado
            ni al 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 no permitido (solo se admite `GET`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Se ha superado el límite de tasa (10 solicitudes por hora por
            equipo). Las solicitudes de paginación de una consulta anterior no
            cuentan para este límite.
          headers:
            Retry-After:
              schema:
                type: string
              description: Tiempo de espera recomendado antes de volver a intentarlo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate limit exceeded
        '503':
          description: >-
            El servicio de analítica no está disponible (p. ej., en despliegues
            autohospedados).
          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 filas de datos de salida.
        pagination:
          type: object
          properties:
            next_page_cursor:
              type:
                - string
                - 'null'
              description: >
                Cursor opaco para obtener la siguiente página de resultados.
                Pasa este valor en el parámetro de consulta `page_cursor`

                en una solicitud posterior. Es `null` cuando no hay más páginas.

                Los cursores de página caducan a las 24 horas.
        metadata:
          type: object
          properties:
            data_freshness:
              type: string
              format: date-time
              description: >-
                Marca de tiempo que indica cuándo se actualizaron por última vez
                los datos subyacentes (truncada a la hora).
            query_time_ms:
              type: integer
              format: int64
              description: >-
                Tiempo de ejecución de la consulta en el servidor, en
                milisegundos.
            team_id:
              type: string
              description: >-
                El ID del equipo determinado a partir de la clave de servicio
                autenticada.
            group_id:
              type: string
              description: >-
                El ID del grupo a cuyo ámbito se limitaron los resultados. Solo
                está presente cuando se proporcionó `group_id`.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Mensaje de error legible por humanos.
    OutputRow:
      type: object
      properties:
        timestamp:
          type: string
          description: >
            Intervalo temporal de la fila. El formato depende de `granularity`:
            `YYYY-MM-DD` para intervalos diarios, `YYYY-MM` para mensuales.

            Solo está presente cuando se especifica `granularity`.
          examples:
            - '2026-05-01T00:00:00.000Z'
            - 2026-05
        user_id:
          type: string
          description: >-
            Identificador de usuario (UID de autenticación). Solo está presente
            cuando `group_by` incluye `user`.
        user_email:
          type: string
          description: >-
            Dirección de correo electrónico del usuario. Solo está presente
            cuando `group_by` incluye `user`.
          examples:
            - alice@example.com
        session_id:
          type: string
          description: >-
            Identificador de conversación de Devin Desktop o de sesión de Devin
            CLI. Solo está presente cuando `group_by` incluye `session`.
        model_uid:
          type: string
          description: >-
            Identificador del modelo. Solo está presente cuando `group_by`
            incluye `model_uid`.
          examples:
            - claude-4-sonnet
        ide:
          type: string
          description: Nombre del IDE. Solo está presente cuando `group_by` incluye `ide`.
          examples:
            - windsurf
            - devin-cli
        ide_version:
          type: string
          description: >-
            Versión del IDE. Solo está presente cuando `group_by` incluye
            `ide_version` (que además requiere `ide`).
          examples:
            - 1.0.0
        os:
          type: string
          description: >-
            Sistema operativo desde el que se envió la solicitud. Solo está
            presente cuando `group_by` incluye `os`.
          examples:
            - darwin
            - windows
            - linux
        source:
          type: string
          enum:
            - CASCADE_CLIENT
            - CHISEL
          description: >
            Cliente en el que se aceptaron las líneas: `CASCADE_CLIENT` para
            Devin Desktop, `CHISEL` para Devin CLI

            (incluida la CLI cuando se ejecuta como agente dentro de otros
            editores). Solo está presente cuando `group_by` incluye `source`.
        loc_inserted:
          type: integer
          format: int64
          description: >-
            Líneas insertadas por el agente y aceptadas por el usuario. Solo
            está presente cuando `metric` incluye `loc_inserted`.
        loc_deleted:
          type: integer
          format: int64
          description: >-
            Líneas cuya eliminación por parte del agente fue aceptada por el
            usuario. Solo está presente cuando `metric` incluye `loc_deleted`.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Una clave de servicio con el permiso **Analytics Read**, pasada como
        token Bearer en el encabezado `Authorization`.


        Crea una clave de servicio en tu [configuración del
        equipo](https://windsurf.com/team/settings), en la sección "Service
        Keys".

````

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