curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://server.codeium.com/api/v2alpha/analytics/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/analytics/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/analytics/tools"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.codeium.com/api/v2alpha/analytics/tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "RUN_COMMAND",
"calls": 1842
},
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "SEARCH_WEB",
"calls": 57
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-10-20T02:00:00.000Z",
"query_time_ms": 1104,
"team_id": "team_abc123"
}
}Tool-Aufrufe des Devin-Agenten abrufen
Zählen Sie die Tool-Aufrufe des Agenten, etwa Websuche oder Befehlsausführung, die Ihr Team in Devin Desktop und der Devin CLI getätigt hat – gruppiert nach Tool, Nutzer, Modell, IDE oder Betriebssystem.
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/tools \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/tools"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://server.codeium.com/api/v2alpha/analytics/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://server.codeium.com/api/v2alpha/analytics/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://server.codeium.com/api/v2alpha/analytics/tools"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://server.codeium.com/api/v2alpha/analytics/tools")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/tools")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "RUN_COMMAND",
"calls": 1842
},
{
"user_id": "user_abc123",
"user_email": "alice@example.com",
"tool": "SEARCH_WEB",
"calls": 57
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-10-20T02:00:00.000Z",
"query_time_ms": 1104,
"team_id": "team_abc123"
}
}Authentifizierung
Dieser Endpunkt verwendet Bearer-Token-Authentifizierung. Geben Sie Ihr Token imAuthorization-Header an:
Authorization: Bearer <your_token>
cascade_tool_usage
akzeptiert dieser Endpunkt Devin-Dienstbenutzer-API-Schlüssel. Teams auf der Cognition-Plattform können
die Werkzeugnutzung daher auch ohne Windsurf-Service-Schlüssel auswerten.
Kennzahlen
Der Query-Parametermetric ist erforderlich und akzeptiert derzeit nur calls, also die Anzahl der Tool-Aufrufe,
die der Agent ausgeführt hat. Diese Kennzahl erscheint in jeder Zeile als ganzzahliges Feld calls. Anfragen ohne metric oder
mit einer anderen Kennzahl schlagen mit dem Statuscode 400 fehl.
Tool-Aufrufe werden gezählt, wenn der Agent ein Tool in Devin Desktop
oder in der Devin CLI aufruft (auch wenn die CLI als Agent in anderen Editoren läuft), und zwar unabhängig vom Modell.
Der Parameter product ist ebenfalls erforderlich und akzeptiert derzeit nur agent.
Tools
Gruppieren Sie nachtool, um Aufrufe nach Tool-Kategorie aufzuschlüsseln. Jede Zeile enthält dann ein Feld tool mit einem der
folgenden Werte:
| Tool | Beschreibung |
|---|---|
SEARCH_WEB | Websuche, Web-Fetch und Browsernutzung |
RUN_COMMAND | Shell-Befehle und Interaktion mit laufenden Prozessen |
VIEW_FILE | Lesen von Dateien und Notebooks |
CODE_ACTION | Bearbeiten, Schreiben und Patchen von Dateien |
GREP_SEARCH | Durchsuchen von Dateiinhalten und Code |
FIND | Suchen von Dateien nach Namen |
LIST_DIRECTORY | Auflisten von Verzeichnissen |
MCP_TOOL | Aufrufen von MCP-Server-Tools und Auflisten von MCP-Servern, Tools oder Ressourcen |
SKILL | Auflisten, Durchsuchen und Aufrufen von Fähigkeiten |
ASK_USER_QUESTION | Stellen von Fragen an den Nutzer |
MEMORY | Lesen und Schreiben von Memorys |
PROPOSE_CODE | Vorschlagen von Codeänderungen |
PROXY_WEB_SERVER | Browservorschau eines lokalen Webservers |
DEPLOY_WEB_APP | Bereitstellen einer Web-App |
MQUERY | Codebasis-Suche (Riptide) |
DEEPWIKI | DeepWiki-Anfragen |
CODEMAP_GENERATION, CODEMAP_SUGGESTIONS | Codemaps-Anfragen |
OTHER | Devin CLI-Tools, die keiner der oben genannten Kategorien zugeordnet sind |
LIST_DIRECTORY, MEMORY, PROPOSE_CODE,
PROXY_WEB_SERVER, DEPLOY_WEB_APP und MQUERY werden für den Devin Desktop-Agent aufgezeichnet. Neue
Devin CLI-Tools, denen noch keine Kategorie zugewiesen wurde, werden dagegen unter OTHER gezählt.
Gruppierung und Granularität
Verwenden Siegranularity und group_by, um die Struktur der zurückgegebenen Daten zu steuern:
- Keine Granularität oder Gruppierung — gibt eine einzige aggregierte Zeile für den gesamten Zeitraum zurück
granularity=daily— jede Zeile enthält einentimestampim FormatYYYY-MM-DDgranularity=monthly— jede Zeile enthält einentimestampim FormatYYYY-MMgroup_by=tool— jede Zeile enthält eintool(siehe Tools oben)group_by=user— jede Zeile enthält eineuser_idsowie eineuser_email, sofern für diesen Nutzer eine hinterlegt istgroup_by=model_uid— jede Zeile enthält einemodel_uidgroup_by=ide— jede Zeile enthält eineidegroup_by=ide,ide_version— jede Zeile enthältideundide_version(für die Gruppierung nachide_versionmuss auchideangegeben sein)group_by=os— jede Zeile enthält einos, zum Beispieldarwin(macOS),windowsoderlinux
group_by=user,tool gibt zum Beispiel an, wie oft jeder Nutzer welches
Tool aufgerufen hat. Die Dimensionen session und source aus Get Output
werden hier nicht unterstützt. Es gelten dieselben Filter models, group_id und user_id wie bei
Get Consumption, zusätzlich ein Filter tool, der
die Zählung auf eine Tool-Kategorie beschränkt (zum Beispiel tool=SEARCH_WEB). tool wird nur von
diesem Endpunkt akzeptiert; wird der Filter an einen anderen Endpunkt der Analytics API v2 übergeben, schlägt die Anfrage mit 400 fehl.
Beispiel
Websuchen pro Nutzer innerhalb einer Woche zählen:curl "https://server.codeium.com/api/v2alpha/analytics/tools?metric=calls&product=agent&start_date=2026-10-13&end_date=2026-10-19&group_by=user&tool=SEARCH_WEB" \
-H "Authorization: Bearer $DEVIN_API_KEY"
SEARCH_WEB-Anzahl eines Nutzers. Wenn Sie stattdessen alle
Kategorien pro Nutzer sehen möchten, entfernen Sie den tool-Filter und fügen Sie group_by=user,tool hinzu.
Paginierung
Ergebnisse werden paginiert, die Standard-Seitengröße beträgt 1.000 Zeilen (maximal 10.000). Wenn weitere Ergebnisse verfügbar sind, enthält die Antwort im Objektpagination einen next_page_cursor. Übergeben Sie diesen als Query-Parameter page_cursor
in einer Anfrage, die ansonsten dieselben Query-Parameter wie die ursprüngliche Anfrage enthält. Cursor sind an den Endpunkt gebunden, der sie ausgegeben hat; ein Cursor von /consumption oder /output
wird mit 400 abgelehnt.
Seitencursor laufen nach 24 Stunden ab. Eine Folgeanfrage für eine weitere Seite wird nicht als neue Abfrage auf Ihr Ratenlimit angerechnet.
Ratenlimits
Dieser Endpunkt ist auf 10 Anfragen pro Stunde pro Team begrenzt. Wenn Sie dieses Limit überschreiten, gibt der Server429 Too Many Requests mit einem Retry-After-Header zurück.
Das Paginieren einer früheren 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
periodische Berichte gedacht ist und nicht für ein Echtzeit-Monitoring der Nutzung.Autorisierungen
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 im Abschnitt „Service Keys“.
Abfrageparameter
Zurückzugebende Kennzahl; erscheint als Feld in jeder Zeile. Unterstützte Kennzahlen:
calls— Anzahl der Tool-Aufrufe des Agenten
Beginn des Datumsbereichs (einschließlich) im Format YYYY-MM-DD.
Ende des Datumsbereichs (einschließlich) im Format YYYY-MM-DD. Der Bereich darf 90 Tage nicht überschreiten.
Produkt, für das Tool-Aufrufe abgefragt werden sollen.
agent Zeitliche Granularität für die Gruppierung der Ergebnisse. Ist sie angegeben, enthält jede Zeile ein Feld timestamp.
Andernfalls werden die Ergebnisse über den gesamten Datumsbereich aggregiert.
daily, monthly Kommagetrennte Liste der Dimensionen, nach denen die Ergebnisse gruppiert werden sollen. Unterstützte Dimensionen:
tool— enthälttoolin jeder Zeile (die Tool-Kategorie, etwaSEARCH_WEBoderRUN_COMMAND)user— enthältuser_idin jeder Zeile sowieuser_email, wenn für den Nutzer eine E-Mail-Adresse aufgezeichnet wurdemodel_uid— enthältmodel_uidin jeder Zeileide— enthältidein jeder Zeileide_version— enthältide_versionin jeder Zeile; setzt voraus, dass auchideenthalten istos— enthältosin jeder Zeile
Kommagetrennte Liste von Modell-UIDs, auf die die Ergebnisse beschränkt werden sollen.
Die Zählung auf eine Tool-Kategorie beschränken, etwa SEARCH_WEB oder RUN_COMMAND (exakte Übereinstimmung).
Wird nur von diesem Endpunkt akzeptiert.
Ergebnisse auf Nutzer einer spezifischen Gruppe beschränken. Der Service-Schlüssel muss Zugriff auf diese Gruppe haben. Nicht mit Devin-Dienstbenutzer-API-Schlüsseln unterstützt.
Ergebnisse auf einen spezifischen Nutzer (Authentifizierungs-UID) beschränken.
Maximale Anzahl der Zeilen, die pro Seite zurückgegeben werden.
1 <= x <= 10000Opaker Cursor aus pagination.next_page_cursor einer vorherigen Antwort zum Abrufen der nächsten Seite. Übergeben Sie denselben metric-Wert wie in der Anfrage, für die der Cursor ausgegeben wurde; von anderen Endpunkten ausgegebene Cursor werden abgelehnt.

