跳转到主要内容
Organization API 和 Enterprise API 中的所有列表端点都使用 基于游标的分页。这可以在结果集大小无论如何变化的情况下,仍然提供一致且高效的分页体验。

工作原理

每个列表接口都接受两个查询参数:
ParameterTypeDescription
firstinteger每页返回的最大项目数(默认值因接口而异)
afterstring上一个响应返回的不透明游标。获取第一页时省略该参数

响应格式

列表类型的响应包含分页元数据:
{
  "items": [...],
  "has_next_page": true,
  "end_cursor": "eyJsYXN0X2lkIjoiYWJjMTIzIn0=",
  "total": 142
}
字段说明
items当前页的结果数组
has_next_page如果还有更多结果,则为 true
end_cursor将此作为 after 参数传入,以获取下一页。当 has_next_pagefalse 时为 null
total匹配项的总数(出于性能原因,某些端点可能会省略该字段)

示例:对会话进行分页

第一页

curl "https://api.devin.ai/v3/organizations/sessions?first=10" \
  -H "Authorization: Bearer $DEVIN_API_KEY"

下一页

使用上一次响应中的 end_cursor 值:
curl "https://api.devin.ai/v3/organizations/sessions?first=10&after=eyJsYXN0X2lkIjoiYWJjMTIzIn0=" \
  -H "Authorization: Bearer $DEVIN_API_KEY"

汇总所有结果

import os
import requests

url = "https://api.devin.ai/v3/organizations/sessions"
headers = {"Authorization": f"Bearer {os.environ['DEVIN_API_KEY']}"}
all_sessions = []
cursor = None

while True:
    params = {"first": 50}
    if cursor:
        params["after"] = cursor

    response = requests.get(url, headers=headers, params=params).json()
    all_sessions.extend(response["items"])

    if not response.get("has_next_page"):
        break
    cursor = response["end_cursor"]

print(f"Fetched {len(all_sessions)} sessions")

从基于 offset 的分页方式迁移

如果你正在从 API v1 或 v2 迁移,请将 offset/limit 替换为 after/first
# 之前 (v1/v2)
curl ".../v1/sessions?offset=50&limit=25"

# 之后
curl ".../v3/organizations/sessions?first=25&after=CURSOR_FROM_PREVIOUS_PAGE"
基于游标的分页比基于偏移量的分页更可靠,因为在翻页过程中新增或删除条目也不会影响分页结果。