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"
}
}Obtener la salida del agente (líneas de código)
Consulta las líneas de código insertadas y eliminadas por el agente y aceptadas por tu equipo en Devin Desktop y Devin CLI, con opciones de filtrado, agrupación y paginación.
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"
}
}Autenticación
Este endpoint utiliza autenticación mediante Bearer token. Incluye tu token en el encabezadoAuthorization:
Authorization: Bearer <your_token>
Métricas
El parámetro de consultametric es obligatorio y admite una lista separada por comas de las métricas que se deben devolver.
Cada métrica solicitada aparece como un campo de tipo entero en cada fila:
| Métrica | Descripción |
|---|---|
loc_inserted | Líneas insertadas por el agente que el usuario aceptó |
loc_deleted | Líneas eliminadas por el agente que el usuario aceptó |
?metric=loc_inserted,loc_deleted devuelve ambas; ?metric=loc_inserted devuelve solo
loc_inserted. Las solicitudes que no incluyan metric o que indiquen una métrica desconocida fallan con un error 400.
Las líneas se contabilizan cuando un usuario acepta una edición del agente en Devin Desktop o en
Devin CLI, sea cual sea el modelo. El parámetro product también es obligatorio y, por ahora, solo acepta
agent.
Agrupación y granularidad
Usagranularity y group_by para controlar la estructura de los datos devueltos:
- Sin granularidad ni agrupación: devuelve una única fila agregada para todo el rango de fechas
granularity=daily: cada fila incluye untimestampen formatoYYYY-MM-DDgranularity=monthly: cada fila incluye untimestampen formatoYYYY-MMgroup_by=user: cada fila incluye unuser_idy unuser_emailgroup_by=session: cada fila incluye unsession_id(la conversación de Devin Desktop o la sesión de la CLI en la que se aceptaron las líneas)group_by=model_uid: cada fila incluye unmodel_uidgroup_by=ide: cada fila incluye unidegroup_by=ide,ide_version: cada fila incluyeideeide_version(para agrupar poride_versiontambién hay que incluiride)group_by=os: cada fila incluye unos, comodarwin(macOS),windowsolinuxgroup_by=source: cada fila incluye unsource:CASCADE_CLIENTpara las líneas aceptadas en Devin Desktop yCHISELpara las líneas aceptadas en la Devin CLI (incluida la CLI que se ejecuta como agente dentro de otros editores)
group_by=user,source,model_uid. Se aplican los mismos filtros models,
group_id y user_id que en Get Consumption.
Paginación
Los resultados se paginan con un tamaño de página predeterminado de 1.000 filas (máximo 10.000). Cuando hay más resultados disponibles, la respuesta incluye unnext_page_cursor en el objeto pagination. Pásalo como parámetro de consulta page_cursor
para obtener la siguiente página, junto con la misma lista de metric de la solicitud original. Los cursores están vinculados
al endpoint y a las métricas que los generaron; un cursor de /consumption, o uno generado para una lista de metric
distinta, se rechaza con un error 400.
Los cursores de página caducan a las 24 horas. Las solicitudes de páginas sucesivas no cuentan como consultas nuevas a efectos de tu límite de tasa.
Límites de tasa
Este endpoint tiene un límite de tasa de 10 solicitudes por hora por equipo. Si superas este límite, el servidor devuelve429 Too Many Requests con un encabezado Retry-After.
Paginar una consulta anterior (siguiendo un next_page_cursor) no cuenta para este límite;
solo cuenta la consulta inicial de cada informe. Este límite es bajo porque el endpoint está pensado para
generar informes periódicos, no para supervisar el uso en tiempo real.Autorizaciones
Una clave de servicio con el permiso Analytics Read, pasada como token Bearer en el encabezado Authorization.
Crea una clave de servicio en tu configuración del equipo, en la sección "Service Keys".
Parámetros de consulta
Lista de métricas de salida que se devolverán, separadas por comas; cada una aparece como un campo en cada fila. Métricas admitidas:
loc_inserted— líneas insertadas por el agente que el usuario aceptóloc_deleted— líneas eliminadas por el agente que el usuario aceptó
Fecha de inicio del intervalo (incluida) en formato YYYY-MM-DD.
Fecha de fin del intervalo (incluida) en formato YYYY-MM-DD. El intervalo no debe superar los 90 días.
Producto cuyos datos de salida se consultarán.
agent Granularidad temporal para agrupar los resultados. Si se especifica, cada fila incluye un campo timestamp.
Si se omite, los resultados se agregan para todo el intervalo de fechas.
daily, monthly Lista de dimensiones, separadas por comas, por las que se agruparán los resultados. Dimensiones admitidas:
user— incluyeuser_idyuser_emailen cada filasession— incluyesession_iden cada filamodel_uid— incluyemodel_uiden cada filaide— incluyeideen cada filaide_version— incluyeide_versionen cada fila; requiere que también se incluyaideos— incluyeosen cada filasource— incluyesourceen cada fila (CASCADE_CLIENTpara Devin Desktop,CHISELpara Devin CLI)
Lista de UID de modelos, separados por comas, a los que se limitarán los resultados.
Filtra los resultados para incluir solo usuarios de un grupo específico. La clave de servicio debe tener acceso a este grupo. No se admite con claves de API de usuarios de servicio de Devin.
Filtra los resultados para incluir solo un usuario específico (UID de autenticación).
Número máximo de filas que se devolverán por página.
1 <= x <= 10000Cursor opaco obtenido del campo pagination.next_page_cursor de una respuesta anterior para recuperar la siguiente página. Proporcione la misma lista de metric que en la solicitud que generó el cursor; se rechazan los cursores generados por otros endpoints o para una lista de metric diferente.

