获取活跃用户分析
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/active-users \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/active-users"
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/active-users', 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/active-users",
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/active-users"
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/active-users")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/active-users")
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": [
{
"active_users": 142
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-01-16T03:00:00.000Z",
"query_time_ms": 612,
"team_id": "team_abc123"
}
}
分析 API
获取活跃用户数
查询你团队的独立活跃用户数,并可选择时间粒度和按用户分组。
GET
/
api
/
v2alpha
/
analytics
/
active-users
获取活跃用户分析
curl --request GET \
--url https://server.codeium.com/api/v2alpha/analytics/active-users \
--header 'Authorization: Bearer <token>'import requests
url = "https://server.codeium.com/api/v2alpha/analytics/active-users"
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/active-users', 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/active-users",
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/active-users"
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/active-users")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://server.codeium.com/api/v2alpha/analytics/active-users")
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": [
{
"active_users": 142
}
],
"pagination": {
"next_page_cursor": null
},
"metadata": {
"data_freshness": "2026-01-16T03:00:00.000Z",
"query_time_ms": 612,
"team_id": "team_abc123"
}
}
这是一个v2 端点,使用 Bearer 令牌进行身份验证和查询参数;不同于 v1 分析 API,后者在请求体中使用服务密钥。请参阅下方的 身份验证。
此端点不适用于实时用量监控。数据按小时聚合,且
速率限制较低 (每个团队每小时 10 个请求) 。请将其用于定期报告和批量导出。
身份验证
Authorization 标头中提供你的令牌:
Authorization: Bearer <your_token>
什么情况下会计为活跃用户
active_users 字段表示不同用户的数量。
活跃用户数包含 Devin CLI 和 Devin Desktop 两者 的用量。用户只要在其中任一方
(或两者) 有用量,就会被计入,并且每个时间段只会计一次。
分组与粒度
granularity 和 group_by 控制返回数据的结构:
- 不设置粒度或分组 — 返回单行数据,其中包含整个日期范围内的活跃用户总数
granularity=daily— 每行都包含一个YYYY-MM-DD格式的timestamp(日活跃用户)granularity=monthly— 每行都包含一个YYYY-MM格式的timestamp(月活跃用户)group_by=user— 每个活跃用户返回一行,并包含user_id;每行的active_users都为1
与 获取用量 不同,活跃用户端点的
group_by 仅支持 user。其他维度 (model_uid、ide、os) 在此处无效。分页
pagination 对象中包含一个 next_page_cursor。将其作为 page_cursor 查询
参数传入,以获取下一页。
页面游标会在 24 小时后过期。后续的分页请求不会作为新的查询计入你的速率限制。
缓存
ETag 标头。为避免重复传输数据,请在请求中附带之前的 ETag 值作为 If-None-Match 标头;如果数据未发生变化,服务器将返回 304 Not Modified。
速率限制
429 Too Many Requests,并附带 Retry-After 标头。
对先前查询结果进行分页 (沿用 next_page_cursor) 不会计入此限制——
只有每份报告的初始查询才会计入。较低的限制说明,此端点用于
定期报告,而非实时用量监控。授权
请求头
来自上一个响应的 ETag 值。如果数据未发生变化,服务器将返回 304 Not Modified。
查询参数
日期范围的开始日期(含),格式为 YYYY-MM-DD。
日期范围的结束日期(含),格式为 YYYY-MM-DD。范围不得超过 90 天。
要查询活跃用户数的产品。
可用选项:
agent 用于对结果分组的时间粒度。指定后,每一行都包含 timestamp 字段。
如果省略,活跃用户数会在整个日期范围内聚合。
可用选项:
daily, monthly 用于对结果分组的维度。活跃用户端点仅支持 user,这会为每个活跃用户返回一行
(每行的 active_users = 1)。
可用选项:
user 用于筛选结果的模型 UID 逗号分隔列表。
将结果筛选为特定组中的用户。服务密钥必须具有该组的访问权限。
将结果筛选为特定用户(auth UID)。
每页返回的最大行数。
必填范围:
1 <= x <= 10000来自上一个响应中 pagination.next_page_cursor 的不透明游标,用于获取下一页。

