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"
}
}Ottenere le chiamate agli strumenti dell'agente Devin
Conta le chiamate agli strumenti effettuate dall’agente, come la ricerca sul web o l’esecuzione di comandi, dal tuo team in Devin Desktop e nella Devin CLI, raggruppate per strumento, utente, modello, IDE o sistema operativo.
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"
}
}Autenticazione
Questo endpoint usa l’autenticazione tramite token Bearer. Includi il tuo token nell’intestazioneAuthorization:
Authorization: Bearer <your_token>
cascade_tool_usage,
questo endpoint accetta le API key dell’utente di servizio Devin, quindi i team sulla piattaforma Cognition possono
monitorare l’utilizzo degli strumenti senza una chiave di servizio Windsurf.
Metriche
Il parametro di querymetric è obbligatorio e al momento accetta solo calls, ovvero il numero di chiamate agli strumenti
effettuate dall’agente. Compare come campo intero calls in ogni riga. Le richieste senza metric, o
che specificano un’altra metrica, falliscono con errore 400.
Le chiamate agli strumenti vengono conteggiate quando l’agente invoca uno strumento in Devin Desktop
o nella Devin CLI (inclusa la CLI eseguita come agente all’interno di altri editor), con qualsiasi modello.
Anche il parametro product è obbligatorio e al momento accetta solo agent.
Strumenti
Raggruppa pertool per suddividere le chiamate in base alla categoria di strumento. Ogni riga include quindi un campo tool con uno dei
seguenti valori:
| Strumento | Descrizione |
|---|---|
SEARCH_WEB | Ricerca sul web, recupero di pagine web e uso del browser |
RUN_COMMAND | Comandi della shell e interazione con i processi in esecuzione |
VIEW_FILE | Lettura di file e notebook |
CODE_ACTION | Modifica, scrittura e applicazione di patch ai file |
GREP_SEARCH | Ricerca nel contenuto dei file e nel codice |
FIND | Ricerca di file per nome |
LIST_DIRECTORY | Elenco del contenuto delle directory |
MCP_TOOL | Chiamata di strumenti dei server MCP ed elenco di server MCP, strumenti o risorse |
SKILL | Elenco, ricerca e invocazione di skill |
ASK_USER_QUESTION | Domande all’utente |
MEMORY | Lettura e scrittura di memorie |
PROPOSE_CODE | Proposta di modifiche al codice |
PROXY_WEB_SERVER | Anteprima nel browser di un server web locale |
DEPLOY_WEB_APP | Distribuzione di un’applicazione web |
MQUERY | Ricerca nella codebase (Riptide) |
DEEPWIKI | Richieste DeepWiki |
CODEMAP_GENERATION, CODEMAP_SUGGESTIONS | Richieste Codemaps |
OTHER | Strumenti della Devin CLI che non rientrano nelle categorie precedenti |
LIST_DIRECTORY, MEMORY, PROPOSE_CODE,
PROXY_WEB_SERVER, DEPLOY_WEB_APP e MQUERY vengono registrate per l’agente di Devin Desktop, mentre i nuovi
strumenti della Devin CLI a cui non è ancora stata assegnata una categoria vengono conteggiati in OTHER.
Raggruppamento e granularità
Usagranularity e group_by per controllare la struttura dei dati restituiti:
- Nessuna granularità o raggruppamento — restituisce una singola riga aggregata per l’intero intervallo di date
granularity=daily— ogni riga include untimestampin formatoYYYY-MM-DDgranularity=monthly— ogni riga include untimestampin formatoYYYY-MMgroup_by=tool— ogni riga include untool(vedi Strumenti sopra)group_by=user— ogni riga include unuser_id, oltre a unuser_emailse ne è registrato uno per quell’utentegroup_by=model_uid— ogni riga include unmodel_uidgroup_by=ide— ogni riga include unidegroup_by=ide,ide_version— ogni riga includeideeide_version(per raggruppare peride_versionè necessario includere ancheide)group_by=os— ogni riga include unos, ad esempiodarwin(macOS),windowsolinux
group_by=user,tool indica quante volte ciascun utente ha invocato ciascuno
strumento. Le dimensioni session e source di Get Output
non sono supportate in questo caso. Si applicano gli stessi filtri models, group_id e user_id di
Get Consumption, oltre a un filtro tool che
limita il conteggio a una sola categoria di strumenti (ad esempio tool=SEARCH_WEB). tool è accettato solo da
questo endpoint: se lo passi a un altro endpoint di Analytics API v2, la richiesta non riesce e restituisce 400.
Esempio
Conta le ricerche sul web per utente nell’arco di una settimana: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 di un utente. Per visualizzare invece tutte le
categorie per ciascun utente, rimuovi il filtro tool e aggiungi group_by=user,tool.
Paginazione
I risultati sono paginati con una dimensione di pagina predefinita di 1.000 righe (massimo 10.000). Se sono disponibili altri risultati, la risposta include unnext_page_cursor nell’oggetto pagination. Passalo come parametro di query page_cursor
in una richiesta che ripeta per il resto i parametri di query originali. I cursori sono vincolati all’endpoint che li ha emessi: un cursore proveniente da /consumption o /output
viene rifiutato con 400.
I cursori di pagina scadono dopo 24 ore. La richiesta di una pagina successiva non viene conteggiata come nuova query ai fini del tuo limite di frequenza.
Limiti di frequenza
Questo endpoint ha un limite di 10 richieste all’ora per team. Se superi questo limite, il server restituisce429 Too Many Requests con un’intestazione 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 è basso perché questo endpoint è pensato per
la reportistica periodica, non per il monitoraggio dell’utilizzo in tempo reale.Autorizzazioni
Una chiave di servizio con autorizzazione Analisi Read, passata come token Bearer nell'header Authorization.
Crea una chiave di servizio nelle impostazioni del team, nella sezione "Service Keys".
Parametri della query
Metrica da restituire; compare come campo in ogni riga. Metriche supportate:
calls— numero di chiamate agli strumenti effettuate dall'agente
Data di inizio dell'intervallo (inclusa) nel formato YYYY-MM-DD.
Data di fine dell'intervallo (inclusa) nel formato YYYY-MM-DD. L'intervallo non deve superare 90 giorni.
Prodotto per cui recuperare le chiamate agli strumenti.
agent Granularità temporale per il raggruppamento dei risultati. Quando è specificata, ogni riga include un campo timestamp.
Se omessa, i risultati vengono aggregati sull'intero intervallo di date.
daily, monthly Elenco delle dimensioni, separate da virgole, in base alle quali raggruppare i risultati. Dimensioni supportate:
tool— includetoolin ogni riga (la categoria dello strumento, comeSEARCH_WEBoRUN_COMMAND)user— includeuser_idin ogni riga, oltre auser_emailse registrato per l'utentemodel_uid— includemodel_uidin ogni rigaide— includeidein ogni rigaide_version— includeide_versionin ogni riga; richiede che sia incluso ancheideos— includeosin ogni riga
Elenco degli UID dei modelli, separati da virgole, in base ai quali filtrare i risultati.
Limita il conteggio a una sola categoria di strumenti, come SEARCH_WEB o RUN_COMMAND (corrispondenza esatta).
Accettato solo da questo endpoint.
Filtra i risultati per includere solo gli utenti di un gruppo specifico. La chiave di servizio deve avere accesso a questo gruppo. Non supportato con le API key degli utenti di servizio Devin.
Filtra i risultati per includere solo un utente specifico (UID auth).
Numero massimo di righe da restituire per pagina.
1 <= x <= 10000Cursore opaco ricavato da pagination.next_page_cursor di una risposta precedente, per recuperare la pagina successiva. Passa lo stesso valore di metric usato nella richiesta che ha generato il cursore; i cursori generati da altri endpoint vengono rifiutati.

