メインコンテンツへスキップ
Organization API および Enterprise API のすべてのリスト系エンドポイントでは、カーソルベースのページネーションを使用します。これにより、結果セットのサイズにかかわらず、一貫性があり効率的なページネーションが可能になります。

仕組み

すべてのリストエンドポイントは、2 つのクエリパラメータを受け取ります。
ParameterTypeDescription
firstinteger1 ページあたりに返す項目数の上限(デフォルト値はエンドポイントごとに異なります)
afterstring前のレスポンスで返された不透明なカーソル。最初のページでは省略します

レスポンス形式

リスト形式のレスポンスには、ページネーション用のメタデータが含まれます:
{
  "items": [...],
  "has_next_page": true,
  "end_cursor": "eyJsYXN0X2lkIjoiYWJjMTIzIn0=",
  "total": 142
}
FieldDescription
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")

オフセットベースのページネーションからの移行

API v1 または v2 から移行する場合は、offset/limitafter/first に置き換えてください。
# 変更前 (v1/v2)
curl ".../v1/sessions?offset=50&limit=25"

# 変更後
curl ".../v3/organizations/sessions?first=25&after=CURSOR_FROM_PREVIOUS_PAGE"
カーソルベースのページネーションは、ページ間でアイテムが追加・削除されても影響を受けないため、オフセットベースのページネーションよりも信頼性が高くなります。