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"
}
}Obtenir les appels d’outils de l’Agent Devin
Comptabilisez les appels d’outils effectués par l’agent, comme la recherche Web ou l’exécution de commandes, pour votre Team dans Devin Desktop et la Devin CLI, regroupés par outil, utilisateur, modèle, IDE ou système d’exploitation.
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"
}
}Authentification
Cet endpoint utilise l’authentification par jeton Bearer. Incluez votre token dans l’en-têteAuthorization :
Authorization: Bearer <your_token>
cascade_tool_usage,
cet endpoint accepte les clés API d’utilisateur de service Devin : les Teams de la plateforme Cognition peuvent donc
suivre l’utilisation des outils sans clé de service Windsurf.
Métriques
Le paramètre de requêtemetric est obligatoire et n’accepte actuellement que calls, soit le nombre d’appels d’outils
effectués par l’agent. Il figure sous la forme d’un champ entier calls dans chaque ligne. Les requêtes sans metric, ou
qui spécifient une autre métrique, échouent avec une erreur 400.
Les appels d’outils sont comptabilisés chaque fois que l’agent invoque un outil dans Devin Desktop
ou dans la Devin CLI (y compris lorsque la CLI s’exécute en tant qu’agent dans d’autres éditeurs), quel que soit le modèle utilisé.
Le paramètre product est également obligatoire et n’accepte actuellement que agent.
Outils
Regroupez partool pour ventiler les appels par catégorie d’outil. Chaque ligne comporte alors un champ tool contenant l’une
des valeurs suivantes :
| Outil | Description |
|---|---|
SEARCH_WEB | Recherche Web, récupération de pages Web et utilisation du navigateur |
RUN_COMMAND | Commandes shell et interaction avec les processus en cours d’exécution |
VIEW_FILE | Lecture de fichiers et de notebooks |
CODE_ACTION | Modification, écriture et application de correctifs aux fichiers |
GREP_SEARCH | Recherche dans le contenu des fichiers et dans le code |
FIND | Recherche de fichiers par nom |
LIST_DIRECTORY | Listage des répertoires |
MCP_TOOL | Appel d’outils de serveurs MCP et listage des serveurs MCP, des outils ou des ressources |
SKILL | Listage, recherche et invocation de skills |
ASK_USER_QUESTION | Question posée à l’utilisateur |
MEMORY | Lecture et écriture de mémoires |
PROPOSE_CODE | Proposition de modifications du code |
PROXY_WEB_SERVER | Aperçu dans le navigateur d’un serveur Web local |
DEPLOY_WEB_APP | Déploiement d’une webapp |
MQUERY | Recherche dans la base de code (Riptide) |
DEEPWIKI | Requêtes DeepWiki |
CODEMAP_GENERATION, CODEMAP_SUGGESTIONS | Requêtes Codemaps |
OTHER | Outils Devin CLI ne relevant d’aucune des catégories ci-dessus |
LIST_DIRECTORY, MEMORY, PROPOSE_CODE,
PROXY_WEB_SERVER, DEPLOY_WEB_APP et MQUERY sont enregistrés pour l’agent Devin Desktop, tandis que les nouveaux
outils Devin CLI auxquels aucune catégorie n’a encore été attribuée sont comptabilisés dans OTHER.
Regroupement et granularité
Utilisezgranularity et group_by pour contrôler la structure des données renvoyées :
- Sans granularité ni regroupement — renvoie une seule ligne agrégée pour l’ensemble de la plage de dates
granularity=daily— chaque ligne inclut untimestampau formatYYYY-MM-DDgranularity=monthly— chaque ligne inclut untimestampau formatYYYY-MMgroup_by=tool— chaque ligne inclut untool(voir Outils ci-dessus)group_by=user— chaque ligne inclut unuser_id, ainsi qu’unuser_emaillorsqu’une adresse est enregistrée pour cet utilisateurgroup_by=model_uid— chaque ligne inclut unmodel_uidgroup_by=ide— chaque ligne inclut unidegroup_by=ide,ide_version— chaque ligne inclutideetide_version(le regroupement paride_versionnécessite d’inclure égalementide)group_by=os— chaque ligne inclut unos, par exempledarwin(macOS),windowsoulinux
group_by=user,tool indique combien de fois chaque utilisateur a invoqué chaque
outil. Les dimensions session et source de Get Output
ne sont pas prises en charge ici. Les mêmes filtres models, group_id et user_id que pour
Get Consumption s’appliquent, ainsi qu’un filtre tool qui
limite le décompte à une seule catégorie d’outil (par exemple tool=SEARCH_WEB). tool n’est accepté que par
cet endpoint ; le transmettre à un autre endpoint de l’API d’analyse v2 provoque une erreur 400.
Exemple
Compter les recherches Web par utilisateur sur une semaine :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 d’un utilisateur. Pour afficher plutôt toutes les catégories par utilisateur, supprimez le filtre tool et ajoutez
group_by=user,tool.
Pagination
Les résultats sont paginés, avec une taille de page par défaut de 1 000 lignes (10 000 au maximum). Lorsque d’autres résultats sont disponibles, la réponse contient unnext_page_cursor dans l’objet pagination. Transmettez-le dans le paramètre de requête page_cursor
d’une requête qui reprend, pour le reste, les paramètres de requête d’origine. Les curseurs sont liés à l’endpoint qui les a émis ; un curseur provenant de /consumption ou de /output
est rejeté avec une erreur 400.
Les curseurs de pagination expirent au bout de 24 heures. La requête d’une page suivante n’est pas décomptée comme une nouvelle requête de votre limite de débit.
Limites de débit
Cet endpoint est soumis à une limite de débit de 10 requêtes par heure par Team. En cas de dépassement de cette limite, le serveur renvoie429 Too Many Requests avec un en-tête Retry-After.
La pagination d’une requête antérieure (via un next_page_cursor) n’est pas décomptée de cette limite —
seule la requête initiale de chaque rapport l’est. Cette limite volontairement basse s’explique par le fait que cet endpoint est destiné aux
rapports périodiques, et non à la surveillance de l’utilisation en temps réel.Autorisations
Une clé de service disposant de l’autorisation Analytics Read, transmise comme jeton Bearer dans l’en-tête Authorization.
Créez une clé de service dans les paramètres de votre Team, à l’adresse team settings, dans la section "Service Keys".
Paramètres de requête
Métrique à renvoyer, présentée sous forme de champ sur chaque ligne. Métriques prises en charge :
calls— nombre d’appels d’outils effectués par l’agent
Début de la plage de dates (inclus) au format YYYY-MM-DD.
Fin de la plage de dates (incluse) au format YYYY-MM-DD. La plage ne doit pas dépasser 90 jours.
Produit pour lequel récupérer les données d’appels d’outils.
agent Granularité temporelle du regroupement des résultats. Lorsqu’elle est spécifiée, chaque ligne inclut un champ timestamp.
Si elle est omise, les résultats sont agrégés sur l’ensemble de la plage de dates.
daily, monthly Liste des dimensions selon lesquelles regrouper les résultats, séparées par des virgules. Dimensions prises en charge :
tool— incluttooldans chaque ligne (la catégorie d’outil, commeSEARCH_WEBouRUN_COMMAND)user— inclutuser_iddans chaque ligne, ainsi queuser_emaillorsqu’une adresse e-mail est enregistrée pour l’utilisateurmodel_uid— inclutmodel_uiddans chaque ligneide— inclutidedans chaque ligneide_version— inclutide_versiondans chaque ligne ; nécessite queidesoit également inclusos— inclutosdans chaque ligne
Liste d’UID de modèles, séparés par des virgules, auxquels limiter les résultats.
Limiter le décompte à une seule catégorie d’outil, comme SEARCH_WEB ou RUN_COMMAND (correspondance exacte).
Accepté uniquement par cet endpoint.
Limiter les résultats aux utilisateurs d’un groupe spécifique. La clé de service doit avoir accès à ce groupe. Non pris en charge avec les clés API d’utilisateur de service Devin.
Limiter les résultats à un utilisateur spécifique (UID d’authentification).
Nombre maximal de lignes à renvoyer par page.
1 <= x <= 10000Curseur opaque issu du champ pagination.next_page_cursor d’une réponse précédente, permettant de récupérer la page suivante. Transmettez la même valeur pour metric que dans la requête ayant généré ce curseur ; les curseurs générés par d’autres endpoints sont rejetés.

