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"
}
}Obter output do agente (linhas de código)
Consulte as linhas de código inseridas e excluídas pelo agente e aceitas pela sua equipe no Devin Desktop e no Devin CLI, com filtragem, agrupamento e paginação.
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"
}
}Autenticação
Este endpoint usa autenticação por Bearer token. Inclua seu token no headerAuthorization:
Authorization: Bearer <your_token>
Métricas
O parâmetro de consultametric é obrigatório e recebe uma lista separada por vírgulas com as métricas a serem retornadas.
Cada métrica solicitada aparece como um campo inteiro em todas as linhas:
| Métrica | Descrição |
|---|---|
loc_inserted | Linhas inseridas pelo agente e aceitas pelo usuário |
loc_deleted | Linhas excluídas pelo agente e aceitas pelo usuário |
?metric=loc_inserted,loc_deleted retorna ambas; ?metric=loc_inserted retorna apenas
loc_inserted. Requisições sem metric ou com uma métrica desconhecida falham com 400.
As linhas são contabilizadas quando um usuário aceita uma edição do agente no Devin Desktop ou na
Devin CLI, independentemente do modelo. O parâmetro product também é obrigatório e, no momento, aceita apenas
agent.
Agrupamento e granularidade
Usegranularity e group_by para controlar o formato dos dados retornados:
- Sem granularidade nem agrupamento — retorna uma única linha agregada para todo o intervalo de datas
granularity=daily— cada linha inclui umtimestampno formatoYYYY-MM-DDgranularity=monthly— cada linha inclui umtimestampno formatoYYYY-MMgroup_by=user— cada linha inclui umuser_ide umuser_emailgroup_by=session— cada linha inclui umsession_id(a conversa do Devin Desktop ou a sessão da CLI em que as linhas foram aceitas)group_by=model_uid— cada linha inclui ummodel_uidgroup_by=ide— cada linha inclui umidegroup_by=ide,ide_version— cada linha incluiideeide_version(para agrupar poride_version,idetambém precisa ser incluído)group_by=os— cada linha inclui umos, comodarwin(macOS),windowsoulinuxgroup_by=source— cada linha inclui umasource:CASCADE_CLIENTpara linhas aceitas no Devin Desktop eCHISELpara linhas aceitas na Devin CLI (incluindo a CLI executada como agente em outros editores)
group_by=user,source,model_uid. Aplicam-se os mesmos filtros models,
group_id e user_id de Get Consumption.
Paginação
Os resultados são paginados com um tamanho de página padrão de 1.000 linhas (máximo de 10.000). Quando houver mais resultados disponíveis, a resposta incluirá umnext_page_cursor no objeto pagination. Passe-o no parâmetro de consulta page_cursor
para buscar a próxima página, usando a mesma lista de metric da requisição original. Os cursores ficam vinculados
ao endpoint e às métricas que os emitiram; um cursor de /consumption, ou um emitido para uma lista de metric
diferente, é rejeitado com 400.
Os cursores de página expiram após 24 horas. Uma requisição das páginas seguintes não conta como uma nova consulta no seu limite de taxa de requisições.
Limites de taxa de requisições
Este endpoint tem um limite de 10 requisições por hora por equipe. Se você exceder esse limite, o servidor retornará429 Too Many Requests com um header Retry-After.
Paginar uma consulta anterior (usando um next_page_cursor) não conta para esse limite —
apenas a consulta inicial de cada relatório é contabilizada. O limite baixo se deve ao fato de que este endpoint é voltado para
relatórios periódicos, e não para o monitoramento de uso em tempo real.Autorizações
Uma service key com permissão Analytics Read, enviada como token Bearer no header Authorization.
Crie uma service key em Configurações da equipe, na seção "Service Keys".
Parâmetros de consulta
Lista de métricas de output tipado separadas por vírgulas a serem retornadas; cada uma aparece como um campo em cada linha. Métricas disponíveis:
loc_inserted— linhas inseridas pelo agente e aceitas pelo usuárioloc_deleted— linhas excluídas pelo agente e aceitas pelo usuário
Início do intervalo de datas (inclusive) no formato YYYY-MM-DD.
Fim do intervalo de datas (inclusive) no formato YYYY-MM-DD. O intervalo não deve exceder 90 dias.
Produto cujos dados de output tipado serão consultados.
agent Granularidade temporal para agrupar os resultados. Quando especificada, cada linha inclui um campo timestamp.
Se omitida, os resultados são agregados para todo o intervalo de datas.
daily, monthly Lista de dimensões separadas por vírgulas para agrupar os resultados. Dimensões aceitas:
user— incluiuser_ideuser_emailem cada linhasession— incluisession_idem cada linhamodel_uid— incluimodel_uidem cada linhaide— incluiideem cada linhaide_version— incluiide_versionem cada linha; exige queidetambém seja incluídoos— incluiosem cada linhasource— incluisourceem cada linha (CASCADE_CLIENTpara Devin Desktop,CHISELpara a Devin CLI)
Lista de UIDs de modelos, separados por vírgulas, aos quais os resultados serão restritos.
Restringe os resultados aos usuários de um grupo específico. A chave de serviço deve ter acesso a esse grupo. Não há suporte para esse filtro com chaves de API de usuários de serviço do Devin.
Restringe os resultados a um usuário específico (UID de autenticação).
Número máximo de linhas a retornar por página.
1 <= x <= 10000Cursor opaco obtido de pagination.next_page_cursor em uma resposta anterior, usado para buscar a próxima página. Informe a mesma lista de metric usada na requisição que gerou o cursor; cursores gerados por outros endpoints ou para uma lista de metric diferente são rejeitados.

