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

# Agent-Output abrufen (Codezeilen)

> Fragen Sie die vom Agent eingefügten und gelöschten sowie die von Ihrem Team akzeptierten Codezeilen in Devin Desktop und der Devin CLI ab – mit Filterung, Gruppierung und Paginierung.

<Note>
  Dies ist ein **v2-Endpunkt**, der Bearer-Token-Authentifizierung und Query-Parameter nutzt – im Gegensatz zur v1-Analytics-API, bei der Service-Schlüssel im Request-Body übergeben werden. Siehe [Authentifizierung](#authentication) weiter unten.
</Note>

<Warning>
  Dieser Endpunkt ist **nicht** für die Echtzeitüberwachung der Nutzung gedacht. Die Daten werden stündlich aggregiert, und das
  Ratenlimit ist niedrig (10 Anfragen pro Stunde und Team). Nutzen Sie ihn für regelmäßige Berichte und Massenexporte.
</Warning>

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

Dieser Endpunkt verwendet **Bearer-Token**-Authentifizierung. Geben Sie Ihr Token im `Authorization`-Header an:

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

Verwenden Sie entweder einen API-Schlüssel eines Devin-Service-Benutzers mit der Berechtigung **Use Local Analytics API** oder einen Windsurf-
Service-Schlüssel mit der Berechtigung **Analytics Read**. Wie Sie die jeweiligen Schlüssel erstellen, erfahren Sie unter
[Authentifizierung](/de/desktop/accounts/api-reference/analytics-v2-introduction#authentication).

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

Der Query-Parameter `metric` ist erforderlich und erwartet eine kommagetrennte Liste der zurückzugebenden Metriken.
Jede angeforderte Metrik erscheint in jeder Zeile als Ganzzahlfeld:

| Metrik | Beschreibung |
| - | - |
| `loc_inserted` | Vom Agenten eingefügte Zeilen, die der Nutzer akzeptiert hat |
| `loc_deleted` | Vom Agenten gelöschte Zeilen, die der Nutzer akzeptiert hat |

Zum Beispiel liefert `?metric=loc_inserted,loc_deleted` beide Metriken; `?metric=loc_inserted` liefert nur
`loc_inserted`. Anfragen ohne `metric` oder mit einer unbekannten Metrik schlagen mit `400` fehl.

Zeilen werden gezählt, wenn ein Nutzer eine Bearbeitung des Agenten in [Devin Desktop](/de/desktop/introducing-devin-desktop) oder in der
[Devin CLI](/de/cli) akzeptiert – unabhängig vom verwendeten Modell. Der Parameter `product` ist ebenfalls erforderlich und akzeptiert derzeit nur
`agent`.

<h2 id="grouping-and-granularity">
  Gruppierung und Granularität
</h2>

Verwenden Sie `granularity` und `group_by`, um die Struktur der zurückgegebenen Daten zu steuern:

* **Ohne Granularität oder Gruppierung** — gibt eine einzelne aggregierte Zeile für den gesamten Datumsbereich zurück
* **`granularity=daily`** — jede Zeile enthält einen `timestamp` im Format `YYYY-MM-DD`
* **`granularity=monthly`** — jede Zeile enthält einen `timestamp` im Format `YYYY-MM`
* **`group_by=user`** — jede Zeile enthält eine `user_id` und eine `user_email`
* **`group_by=session`** — jede Zeile enthält eine `session_id` (die Devin Desktop-Unterhaltung oder CLI-Sitzung, in der die Zeilen akzeptiert wurden)
* **`group_by=model_uid`** — jede Zeile enthält eine `model_uid`
* **`group_by=ide`** — jede Zeile enthält eine `ide`
* **`group_by=ide,ide_version`** — jede Zeile enthält `ide` und `ide_version` (für die Gruppierung nach `ide_version` muss auch `ide` angegeben werden)
* **`group_by=os`** — jede Zeile enthält ein `os`, zum Beispiel `darwin` (macOS), `windows` oder `linux`
* **`group_by=source`** — jede Zeile enthält eine `source`: `CASCADE_CLIENT` für in Devin Desktop akzeptierte Zeilen, `CHISEL` für in der Devin CLI akzeptierte Zeilen (einschließlich der CLI, wenn sie als Agent in anderen Editoren läuft)

Dimensionen lassen sich kombinieren, zum Beispiel `group_by=user,source,model_uid`. Es gelten dieselben Filter `models`,
`group_id` und `user_id` wie bei [Get Consumption](/de/desktop/accounts/api-reference/get-consumption).

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

Ergebnisse werden mit einer Standard-Seitengröße von 1.000 Zeilen (max. 10.000) paginiert. Wenn weitere Ergebnisse verfügbar sind,
enthält die Antwort im `pagination`-Objekt einen `next_page_cursor`. Übergeben Sie diesen als Query-Parameter `page_cursor`
zusammen mit derselben `metric`-Liste wie in der ursprünglichen Anfrage, um die nächste Seite abzurufen. Cursor sind an
den Endpunkt und die Metriken gebunden, für die sie ausgestellt wurden. Ein Cursor von `/consumption` oder ein Cursor, der für eine andere
`metric`-Liste ausgestellt wurde, wird mit `400` abgelehnt.

Seiten-Cursor laufen nach 24 Stunden ab. Anfragen für Folgeseiten werden nicht als neue Abfragen auf Ihr Ratenlimit angerechnet.

<h2 id="rate-limits">
  Ratenlimits
</h2>

Für diesen Endpunkt gilt ein Ratenlimit von **10 Anfragen pro Stunde** pro Team. Wenn Sie dieses Limit überschreiten, gibt der
Server `429 Too Many Requests` mit einem `Retry-After`-Header zurück.

Das Paginieren einer vorherigen Abfrage (über einen `next_page_cursor`) wird **nicht** auf dieses Limit angerechnet –
es zählt nur die erste Abfrage pro Bericht. Das niedrige Limit ist darauf zurückzuführen, dass dieser Endpunkt für
regelmäßige Berichte gedacht ist und nicht für die Echtzeitüberwachung der Nutzung.


## OpenAPI

````yaml de/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: >
    Die Analytics-API v2 stellt Analysen zum Credit- und ACU-Verbrauch, zu
    aktiven Nutzern und zur Agentenausgabe

    (akzeptierte Codezeilen) für Enterprise-Teams bereit. Die Daten stammen aus
    stündlich aggregierten Daten und unterstützen flexible Filterung,
    Gruppierung

    und cursorbasierte Paginierung.
servers:
  - url: https://server.codeium.com
security:
  - bearerAuth: []
paths:
  /api/v2alpha/analytics/output:
    get:
      summary: Analysen zur Agentenausgabe abrufen (Codezeilen)
      description: >
        Fragen Sie die Agentenausgabe für das authentifizierte Team ab. Der
        erforderliche Parameter `metric` ist eine

        kommagetrennte Liste der zurückzugebenden Metriken: `loc_inserted`
        und/oder `loc_deleted`, also Zeilen,

        die vom Agenten eingefügt oder gelöscht und von Nutzern in Devin Desktop
        und der Devin CLI akzeptiert wurden.

        Jede angeforderte Metrik wird in jeder Zeile als Ganzzahlfeld
        zurückgegeben. Die Ergebnisse basieren auf stündlich

        aggregierten Daten und können nach Datumsbereich, Produkt, Modell,
        Gruppe und Nutzer gefiltert sowie

        nach denselben Dimensionen wie beim Verbrauch und zusätzlich nach
        `session` und `source` (Devin Desktop vs. CLI) gruppiert werden.


        Diese Endpunkte sind für regelmäßige Berichte und Massenexporte
        ausgelegt. Sie sind **nicht** für die Echtzeit-Überwachung der Nutzung
        gedacht: Die Daten werden stündlich aggregiert, und das Ratenlimit ist
        niedrig (10 Anfragen pro Stunde pro Team).
      operationId: getOutput
      parameters:
        - name: metric
          in: query
          required: true
          schema:
            type: string
          description: >
            Kommagetrennte Liste der zurückzugebenden Ausgabemetriken; jede
            Metrik erscheint als Feld in jeder Zeile. Unterstützte Metriken:

            - `loc_inserted` — vom Agenten eingefügte Zeilen, die der Nutzer
            akzeptiert hat

            - `loc_deleted` — vom Agenten gelöschte Zeilen, deren Löschung der
            Nutzer akzeptiert hat
          example: loc_inserted,loc_deleted
        - name: start_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: Beginn des Datumsbereichs (einschließlich) im Format `YYYY-MM-DD`.
          example: '2026-06-01T00:00:00.000Z'
        - name: end_date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: >-
            Ende des Datumsbereichs (einschließlich) im Format `YYYY-MM-DD`. Der
            Datumsbereich darf höchstens 90 Tage umfassen.
          example: '2026-06-30T00:00:00.000Z'
        - name: product
          in: query
          required: true
          schema:
            type: string
            enum:
              - agent
          description: Produkt, dessen Ausgabedaten abgefragt werden sollen.
          example: agent
        - name: granularity
          in: query
          required: false
          schema:
            type: string
            enum:
              - daily
              - monthly
          description: >
            Zeitliche Granularität für die Gruppierung der Ergebnisse. Bei
            Angabe enthält jede Zeile ein `timestamp`-Feld.

            Ohne Angabe werden die Ergebnisse über den gesamten Datumsbereich
            aggregiert.
        - name: group_by
          in: query
          required: false
          schema:
            type: string
          description: >
            Kommagetrennte Liste der Dimensionen, nach denen die Ergebnisse
            gruppiert werden sollen. Unterstützte Dimensionen:

            - `user` — enthält `user_id` und `user_email` in jeder Zeile

            - `session` — enthält `session_id` in jeder Zeile

            - `model_uid` — enthält `model_uid` in jeder Zeile

            - `ide` — enthält `ide` in jeder Zeile

            - `ide_version` — enthält `ide_version` in jeder Zeile; setzt
            voraus, dass auch `ide` angegeben wird

            - `os` — enthält `os` in jeder Zeile

            - `source` — enthält `source` in jeder Zeile (`CASCADE_CLIENT` für
            Devin Desktop, `CHISEL` für die Devin CLI)
          example: source,model_uid
        - name: models
          in: query
          required: false
          schema:
            type: string
          description: >-
            Kommagetrennte Liste der Modell-UIDs, auf die die Ergebnisse
            beschränkt werden sollen.
          example: claude-4-sonnet,gpt-4.1
        - name: group_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Ergebnisse auf Nutzer einer bestimmten Gruppe beschränken. Der
            Service-Schlüssel muss Zugriff auf diese Gruppe haben. Wird bei
            Verwendung von API-Schlüsseln für Devin-Service-Benutzer nicht
            unterstützt.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Ergebnisse auf einen bestimmten Nutzer (Authentifizierungs-UID)
            beschränken.
        - name: page_size
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 10000
            default: 1000
          description: Maximale Anzahl der pro Seite zurückzugebenden Zeilen.
        - name: page_cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaker Cursor aus dem Feld `pagination.next_page_cursor` einer
            vorherigen Antwort zum Abrufen der nächsten Seite. Übergeben Sie
            dieselbe `metric`-Liste wie in der Anfrage, für die der Cursor
            ausgegeben wurde; Cursor von anderen Endpunkten oder für eine andere
            `metric`-Liste werden abgelehnt.
      responses:
        '200':
          description: Ausgabedaten erfolgreich zurückgegeben.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutputResponse'
              examples:
                by_source:
                  summary: Codezeilen pro Tag nach 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 gruppiert nach Nutzer und Modell
                  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: Ungültige Anfrageparameter.
          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: Authentifizierung fehlgeschlagen oder unzureichende Berechtigungen.
          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: >-
            Der angegebene Seiten-Cursor gehört nicht zum authentifizierten Team
            oder zur angeforderten Gruppe.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                cursor_team_mismatch:
                  value:
                    error: page cursor does not belong to this team
        '405':
          description: HTTP-Methode nicht zulässig (nur `GET` wird unterstützt).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Ratenlimit überschritten (10 Anfragen pro Stunde pro Team). Das
            Abrufen weiterer Seiten einer früheren Abfrage wird nicht auf dieses
            Limit angerechnet.
          headers:
            Retry-After:
              schema:
                type: string
              description: Empfohlene Wartezeit vor einem erneuten Versuch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limited:
                  value:
                    error: rate limit exceeded
        '503':
          description: >-
            Der Analysedienst ist nicht verfügbar (z. B. in self-hosted
            Deployments).
          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 mit den Zeilen der Ausgabedaten.
        pagination:
          type: object
          properties:
            next_page_cursor:
              type:
                - string
                - 'null'
              description: >
                Opaker Cursor zum Abrufen der nächsten Ergebnisseite. Übergeben
                Sie diesen Wert als Query-Parameter `page_cursor`

                in einer Folgeanfrage. `null`, wenn keine weiteren Seiten
                vorhanden sind.

                Seitencursor laufen nach 24 Stunden ab.
        metadata:
          type: object
          properties:
            data_freshness:
              type: string
              format: date-time
              description: >-
                Zeitstempel der letzten Aktualisierung der zugrunde liegenden
                Daten (auf die volle Stunde abgerundet).
            query_time_ms:
              type: integer
              format: int64
              description: Serverseitige Ausführungszeit der Abfrage in Millisekunden.
            team_id:
              type: string
              description: >-
                Die anhand des authentifizierten Service-Schlüssels ermittelte
                Team-ID.
            group_id:
              type: string
              description: >-
                Die ID der Gruppe, auf die die Ergebnisse beschränkt wurden. Nur
                vorhanden, wenn `group_id` angegeben wurde.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Menschenlesbare Fehlermeldung.
    OutputRow:
      type: object
      properties:
        timestamp:
          type: string
          description: >
            Zeitintervall für die Zeile. Das Format hängt von `granularity` ab:
            `YYYY-MM-DD` für Tagesintervalle, `YYYY-MM` für Monatsintervalle.

            Nur vorhanden, wenn `granularity` angegeben ist.
          examples:
            - '2026-05-01T00:00:00.000Z'
            - 2026-05
        user_id:
          type: string
          description: >-
            Nutzerkennung (Authentifizierungs-UID). Nur vorhanden, wenn
            `group_by` den Wert `user` enthält.
        user_email:
          type: string
          description: >-
            E-Mail-Adresse des Nutzers. Nur vorhanden, wenn `group_by` den Wert
            `user` enthält.
          examples:
            - alice@example.com
        session_id:
          type: string
          description: >-
            Kennung der Devin Desktop-Unterhaltung oder der Devin CLI-Sitzung.
            Nur vorhanden, wenn `group_by` den Wert `session` enthält.
        model_uid:
          type: string
          description: >-
            Modellkennung. Nur vorhanden, wenn `group_by` den Wert `model_uid`
            enthält.
          examples:
            - claude-4-sonnet
        ide:
          type: string
          description: IDE-Name. Nur vorhanden, wenn `group_by` den Wert `ide` enthält.
          examples:
            - windsurf
            - devin-cli
        ide_version:
          type: string
          description: >-
            IDE-Version. Nur vorhanden, wenn `group_by` den Wert `ide_version`
            enthält (wofür zusätzlich `ide` erforderlich ist).
          examples:
            - 1.0.0
        os:
          type: string
          description: >-
            Betriebssystem, von dem die Anfrage stammt. Nur vorhanden, wenn
            `group_by` den Wert `os` enthält.
          examples:
            - darwin
            - windows
            - linux
        source:
          type: string
          enum:
            - CASCADE_CLIENT
            - CHISEL
          description: >
            Client, in dem die Zeilen akzeptiert wurden: `CASCADE_CLIENT` für
            Devin Desktop, `CHISEL` für die Devin CLI

            (auch wenn die CLI als Agent in anderen Editoren ausgeführt wird).
            Nur vorhanden, wenn `group_by` `source` enthält.
        loc_inserted:
          type: integer
          format: int64
          description: >-
            Vom Agenten eingefügte Zeilen, die der Nutzer akzeptiert hat. Nur
            vorhanden, wenn `metric` `loc_inserted` enthält.
        loc_deleted:
          type: integer
          format: int64
          description: >-
            Vom Agenten gelöschte Zeilen, deren Löschung der Nutzer akzeptiert
            hat. Nur vorhanden, wenn `metric` `loc_deleted` enthält.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Ein Service-Schlüssel mit der Berechtigung **Analytics Read**, übergeben
        als Bearer-Token im Header `Authorization`.


        Erstellen Sie einen Service-Schlüssel in Ihren [Team
        Settings](https://windsurf.com/team/settings) im Abschnitt „Service
        Keys“.

````

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