获取 Agent 输出分析(代码行数)
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"
}
}分析 API
获取 Agent 产出(代码行数)
query Devin Desktop 和 Devin CLI 中 Agent 插入和删除的代码行数,以及你的团队接受的代码行数,支持过滤、分组和分页。
GET
/
api
/
v2alpha
/
analytics
/
output
获取 Agent 输出分析(代码行数)
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"
}
}这是一个 v2 端点,使用 Bearer token 身份验证和 query 参数,而 v1 分析 API 则是在请求体中传入服务密钥。详见下方的身份验证。
此端点不适用于实时用量监控。数据按小时聚合,且速率限制较低 (每个团队每小时 10 次请求) 。请将其用于定期报告和批量导出。
身份验证
此端点采用 Bearer token 身份验证。请在Authorization 标头中附上你的令牌:
Authorization: Bearer <your_token>
指标
metric query 参数为必填项,取值为以逗号分隔的指标列表,用于指定要返回的指标。
每个请求的指标都会作为整数字段出现在每一行中:
| 指标 | 描述 |
|---|---|
loc_inserted | 由 Agent 插入且被用户接受的行数 |
loc_deleted | 由 Agent 删除且被用户接受的行数 |
?metric=loc_inserted,loc_deleted 会同时返回这两项指标;?metric=loc_inserted 则仅返回
loc_inserted。如果请求未提供 metric,或指定了未知指标,将返回 400 错误。
无论使用哪个模型,只要用户在 Devin Desktop 或
Devin CLI 中接受了 Agent 的编辑,相应的行数就会被计入。product 参数同样为必填项,目前仅支持
agent。
分组与粒度
使用granularity 和 group_by 控制返回数据的结构:
- 不指定粒度或分组 — 返回整个日期范围的单条聚合行
granularity=daily— 每行包含一个YYYY-MM-DD格式的timestampgranularity=monthly— 每行包含一个YYYY-MM格式的timestampgroup_by=user— 每行包含user_id和user_emailgroup_by=session— 每行包含一个session_id(即接受这些代码行时所在的 Devin Desktop 对话或 CLI 会话)group_by=model_uid— 每行包含一个model_uidgroup_by=ide— 每行包含一个idegroup_by=ide,ide_version— 每行包含ide和ide_version(按ide_version分组时必须同时包含ide)group_by=os— 每行包含一个os,例如darwin(macOS) 、windows或linuxgroup_by=source— 每行包含一个source:CASCADE_CLIENT表示在 Devin Desktop 中接受的代码行,CHISEL表示在 Devin CLI 中接受的代码行 (包括在其他编辑器中作为 Agent 运行的 CLI)
group_by=user,source,model_uid。Get Consumption 中的 models、
group_id 和 user_id 过滤器
在此同样适用。
分页
结果以分页形式返回,默认每页 1,000 行 (最多 10,000 行) 。如果还有更多结果, 响应的pagination 对象中会包含 next_page_cursor。将其作为 page_cursor query
参数传入即可获取下一页,同时须使用与原始请求相同的 metric 列表。游标与签发它的
端点及指标绑定;来自 /consumption 的游标,或针对不同 metric 列表签发的游标,
都会被拒绝并返回 400。
页面游标的有效期为 24 小时。获取后续分页的请求不会作为新的 query 计入你的速率限制。
速率限制
此端点的速率限制为每个团队每小时 10 次请求。超出此限制时, 服务器将返回429 Too Many Requests,并附带 Retry-After 标头。
对先前的 query 进行分页 (即沿 next_page_cursor 继续获取) 不计入此限制——
只有每份报告的首次 query 才会计入。限制之所以较低,是因为此端点用于
定期报告,而非实时用量监控。授权
查询参数
要返回的输出指标列表,以逗号分隔;每个指标都会以字段的形式出现在每一行中。支持的指标:
loc_inserted— Agent 插入且被用户接受的代码行数loc_deleted— Agent 删除且被用户接受的代码行数
日期范围的起始日期(含当日),格式为 YYYY-MM-DD。
日期范围的结束日期(含当日),格式为 YYYY-MM-DD。日期范围不得超过 90 天。
要查询其输出数据的产品。
可用选项:
agent 用于对结果分组的时间粒度。指定后,每行都包含一个 timestamp 字段。
如果省略,则汇总整个日期范围内的结果。
可用选项:
daily, monthly 用于对结果分组的维度列表,以逗号分隔。支持的维度:
user— 每行包含user_id和user_emailsession— 每行包含session_idmodel_uid— 每行包含model_uidide— 每行包含ideide_version— 每行包含ide_version;必须同时包含ideos— 每行包含ossource— 每行包含source(Devin Desktop 对应CASCADE_CLIENT,Devin CLI 对应CHISEL)
用于筛选结果的模型 UID 列表,以逗号分隔。
仅返回特定组中用户的结果。服务密钥必须具有该组的访问权限。不支持使用 Devin 服务用户 API 密钥。
仅返回特定用户(身份验证 UID)的结果。
每页返回的最大行数。
必填范围:
1 <= x <= 10000用于获取下一页的不透明游标,取自上一个响应的 pagination.next_page_cursor。请传入与生成该游标的请求相同的 metric 列表;由其他端点生成或针对不同 metric 列表生成的游标将被拒绝。

