curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/output \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/output"
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/output', 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/output",
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/output"
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/output")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/output")
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": [
{
"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"
}
}Obtenir la production de l’agent (lignes de code)
Interrogez les lignes de code insérées et supprimées par l’agent, puis acceptées par votre Team dans Devin Desktop et la Devin CLI, avec filtrage, regroupement et pagination.
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/output \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/output"
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/output', 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/output",
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/output"
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/output")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/output")
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": [
{
"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"
}
}Authentification
Cet endpoint utilise l’authentification par jeton Bearer. Ajoutez votre token dans l’en-têteAuthorization :
Authorization: Bearer <your_token>
Métriques
Le paramètre de requêtemetric est obligatoire et accepte la liste des métriques à renvoyer, séparées par des virgules.
Chaque métrique demandée apparaît sous forme de champ entier dans chaque ligne :
| Métrique | Description |
|---|---|
loc_inserted | Lignes insérées par l’agent et acceptées par l’utilisateur |
loc_deleted | Lignes supprimées par l’agent et acceptées par l’utilisateur |
?metric=loc_inserted,loc_deleted renvoie les deux ; ?metric=loc_inserted renvoie uniquement
loc_inserted. Les requêtes sans metric ou indiquant une métrique inconnue échouent avec une erreur 400.
Les lignes sont comptabilisées lorsqu’un utilisateur accepte une modification de l’agent dans Devin Desktop ou dans
Devin CLI, quel que soit le modèle utilisé. Le paramètre product est également obligatoire et n’accepte actuellement que la valeur
agent.
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=user— chaque ligne inclut unuser_idet unuser_emailgroup_by=session— chaque ligne inclut unsession_id(la conversation Devin Desktop ou la session CLI dans laquelle les lignes ont été acceptées)group_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_versionexige d’inclure égalementide)group_by=os— chaque ligne inclut unos, par exempledarwin(macOS),windowsoulinuxgroup_by=source— chaque ligne inclut unesource:CASCADE_CLIENTpour les lignes acceptées dans Devin Desktop,CHISELpour les lignes acceptées dans la Devin CLI (y compris lorsque la CLI s’exécute en tant qu’agent dans d’autres éditeurs)
group_by=user,source,model_uid. Les filtres models,
group_id et user_id s’appliquent de la même manière que pour Get Consumption.
Pagination
Les résultats sont paginés avec une taille de page par défaut de 1 000 lignes (maximum 10 000). Lorsque d’autres résultats sont disponibles, la réponse inclut unnext_page_cursor dans l’objet pagination. Transmettez-le dans le paramètre de requête page_cursor
pour récupérer la page suivante, avec la même liste metric que dans la requête initiale. Les curseurs sont liés
à l’endpoint et aux métriques pour lesquels ils ont été émis ; un curseur provenant de /consumption, ou émis pour une autre liste
metric, est rejeté avec une erreur 400.
Les curseurs de page expirent au bout de 24 heures. Une requête de page suivante n’est pas comptabilisée comme une nouvelle requête dans votre limite de débit.
Limites de débit
Cet endpoint est limité à 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 précédente (en suivant un next_page_cursor) n’est pas prise en compte dans cette limite —
seule la requête initiale de chaque rapport l’est. Cette limite basse s’explique par le fait que cet endpoint est conçu
pour des rapports périodiques, et non pour 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
Liste des métriques de production à renvoyer, séparées par des virgules ; chaque métrique apparaît sous forme de champ dans chaque ligne. Métriques prises en charge :
loc_inserted— lignes insérées par l’agent et acceptées par l’utilisateurloc_deleted— lignes supprimées par l’agent et dont la suppression a été acceptée par l’utilisateur
Date de début de la plage (incluse) au format YYYY-MM-DD.
Date de fin de la plage (incluse) au format YYYY-MM-DD. La plage ne doit pas dépasser 90 jours.
Produit pour lequel récupérer les données de production.
agent Granularité temporelle utilisée pour regrouper les résultats. Si elle est spécifiée, chaque ligne inclut un champ timestamp.
Sinon, les résultats sont agrégés sur l’ensemble de la plage de dates.
daily, monthly Liste des dimensions de regroupement des résultats, séparées par des virgules. Dimensions prises en charge :
user— inclutuser_idetuser_emaildans chaque lignesession— inclutsession_iddans chaque lignemodel_uid— inclutmodel_uiddans chaque ligneide— inclutidedans chaque ligneide_version— inclutide_versiondans chaque ligne ; nécessite queidesoit également inclusos— inclutosdans chaque lignesource— inclutsourcedans chaque ligne (CASCADE_CLIENTpour Devin Desktop,CHISELpour Devin CLI)
Liste des UID de modèles, séparés par des virgules, auxquels limiter les résultats.
Limiter les résultats aux utilisateurs d’un groupe spécifique. La clé de service doit avoir accès à ce groupe. Ce filtre n’est pas pris en charge avec les API keys d’utilisateurs 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 liste metric que dans la requête ayant généré ce curseur ; les curseurs générés par d’autres endpoints ou pour une liste metric différente sont rejetés.

