Organization API
Organization API を使用すると、組織にリンクされたチーム全体に適用される操作 (たとえば、それらのチーム間でユーザーを移動する操作、チーム全体のプール型利用についてレポートする操作、組織グループを管理する操作、モデルアクセスを読み取るまたは更新する操作) を実行できます。これには、Organization API キー と team Admin API と同じ HTTP パターンを使用します。
- Organization API では、API キーをユーザー名として ベーシック認証 を使用します。
- API キーの作成、認証方法、レート制限、ベストプラクティスの詳細については、API Overview を参照してください。
Organization API キーと Team API キーの違い
Organization API キーは組織スコープの認証情報です。Team API キーはチームスコープの認証情報です。
/organizations/team-memberships/sync、/organizations/pooled-usage、/organizations/groups のような組織レベルのエンドポイントを呼び出す場合は、Organization API キーを使用します。
/teams/* 配下のチームレベルのエンドポイント (例: /teams/members、/teams/spend) を呼び出す場合は、Team API キーを使用します。
主な違い
- スコープ: Organization API キー は、同じ 組織 に紐づく複数のチームにまたがって利用できます。Team API キーは、1 つのチーム内でのみ利用できます。
- エンドポイントの互換性: Organization エンドポイント には Organization API キー が必要です。Team エンドポイント には Team API キーが必要です。
- キーのスコープ: 各ルートでは、キーに特定のスコープが必要です。参照専用の membership ルートでは
members:readを受け付けます。membership と group の書き込みルートにはmembers:*が必要で、usage ルートにはusage:*が必要です。admin:*を持つキーは、admin が他のスコープを含むため、どのルートでも使用できます。 - 認可の失敗: キーのスコープがエンドポイントのスコープと一致しない場合、リクエストは認証または認可エラー (通常は
401または403) で失敗します。
スコープ
すべての Organization API キーには、必ず 1 つのスコープが付与されています。ルートは、そのキーのスコープが対象のルートをカバーしている場合にのみ実行されます。より広いスコープには、より狭いスコープで許可される内容がすべて含まれます。
| スコープ | Access | Example routes |
|---|---|---|
members:read | 組織のメンバーシップに対する参照専用アクセス。 | GET /organizations/members |
members:* | メンバーシップとグループに対する読み取り権限および書き込み権限。members:read で許可される内容がすべて含まれます。 | GET /organizations/members, POST /organizations/team-memberships/sync, すべての /organizations/groups ルート |
usage:* | プール型利用とレポートに対する読み取り権限。 | POST /organizations/pooled-usage, POST /organizations/filtered-usage-events, POST /organizations/daily-usage-data, POST /organizations/spend |
models:read | モデルアクセス設定とプロバイダー一覧に対する参照専用アクセス。 | GET /organizations/teams/model-access/configuration, GET /organizations/teams/{teamId}/model-access/configuration, GET /organizations/teams/{teamId}/model-access/providers |
models:* | モデルアクセスに対する読み取り権限および書き込み権限。models:read で許可される内容がすべて含まれます。 | プロバイダーとモデルの一括切り替えおよび一括設定を含む、すべてのモデルアクセスルート |
admin:* | すべての組織ルートへのフルアクセス。 | 上記すべて |
必要な作業に対して、最も狭いスコープを選択してください。メンバーを一覧表示するだけでメンバーシップを変更しない参照専用の連携には、members:read を使用します。フル管理権限を付与せずにモデルアクセスを自動化するには、models:read または models:* を使用します。ダッシュボードで Organization API キーを作成するときに、これらのスコープを選択できます。
Organization API キーはどのように渡せばよいですか?
他の Cursor API キーと同様に渡します。キーをユーザー名、パスワードを空にして、Basic 認証を使用します。
curl -X POST https://api.cursor.com/organizations/team-memberships/sync \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "users": [ { "userId": 12345, "destinationTeamId": 7 } ] }'メンバー
組織にリンクされているチーム間で組織メンバーシップを参照し、メンバーを移動できます。
- 提供状況: エンタープライズのみ
- 認証: Organization API キー (Basic auth) 。メンバーの参照は参照専用の
members:readスコープ に対応しています。メンバーの移動にはmembers:*が必要です。admin:*を持つ key は両方に使用できます。 - スコープ:
GET /organizations/membersは組織スコープで、ページネーションに対応しており、各 member の organization role と、リンクされているすべての team への割り当てを 1 つのレスポンスで返します。 - ページネーション:
GET /organizations/membersはpageとpageSizeを受け付けます。pageSizeの上限は 200 で、それより大きい値は 200 に切り詰められます。
組織メンバーの一覧
/organizations/membersAPI キーに紐付けられた組織のメンバーを取得します。各メンバーの組織での role と、リンクされたチームでの割り当ても含まれます。結果はページ分割されます。
クエリパラメータ
page number
pageSize number
レスポンスフィールド
members array
userIdnumber - メンバーの一意な数値識別子。チームのGET /teams/membersエンドポイント が返すidと一致しますemailstring - メンバーのメールアドレスnamestring - メンバーの表示名organizationRolestring - 組織レベルの role。adminまたはmemberのいずれかです。これは各チーム割り当てのteamRoleとは異なります。ユーザーは組織ではadminでありながら、特定のチームではmemberrole を持つことも、その逆もあります。teamsarray - 組織にリンクされたチームでのそのメンバーの割り当て。各 object には次が含まれます。teamIdnumber - メンバーが所属するリンク済みチームの整数 IDteamRolestring - そのチームでの role (例:member,owner)
pagination object
page, pageSize, totalCount, totalPages, hasNextPage, hasPreviousPage。curl -X GET "https://api.cursor.com/organizations/members?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:レスポンス:
{ "members": [ { "userId": 12345, "email": "developer@company.com", "name": "Alex", "organizationRole": "member", "teams": [ { "teamId": 7, "teamRole": "member" }, { "teamId": 8, "teamRole": "owner" } ] }, { "userId": 12346, "email": "admin@company.com", "name": "Sam", "organizationRole": "admin", "teams": [ { "teamId": 7, "teamRole": "owner" } ] } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}組織のチームメンバーシップを同期する
/organizations/team-memberships/sync組織内の1人以上のユーザーが所属するチームを設定します。これはCSV インポートAPIのバルク形式と同様の仕様です。ユーザーの配列を送信すると、各ユーザーに対して結果行が返されます。
各エントリには teamIds または destinationTeamId のいずれか一方のみを指定する必要があります:
teamIdsは、ユーザーが所属すべきチーム ID の完全な一覧です。endpoint は、ユーザーの membership がその一覧と正確に一致するように調整します。ユーザーがまだ所属していない一覧内のチームは追加され、一覧にないチームは削除されます。Migration 中に別のチームを追加しつつ、ユーザーを現在のチームに残すには、両方を指定してください (例:[oldTeamId, newTeamId]) 。destinationTeamIdは、ユーザーを1 つのチームに所属させます。ユーザーは指定されたチームに追加され、他のすべてのチームから削除されます。destinationTeamId: NNNの設定は、機能的にはteamIds: [NNN]と同等です。
リクエストボディ
organizationId string 必須
org_abc123) 。エンドポイントを呼び出すために使用する Organization API キーの組織と一致している必要があります。users array 必須
teamIds または destinationTeamId) をちょうど1つ持つオブジェクトです:userIdnumber | string: 同期する対象のユーザー ID。整数の ID (例:12345) または文字列の ID (例:"user_abc123") のいずれかを使用できます。teamIdsnumber[]: 同期後にユーザーが所属しているべき、Org に紐づくチーム ID の完全な一覧です。メンバーシップはこの一覧と完全に一致するように調整されます。一覧に含まれないチームはすべて削除されます。現在所属しているチームを維持するには、それらも含めてください (例:[7, 8]) 。1 エントリあたり最大 100 チームまで指定できます。destinationTeamId数値: 単一のチームに同期するためのフィールドです。destinationTeamId: NNNの設定は、teamIds: [NNN]を送信するのと同じです。ユーザーのチームはその1つのチームのみに設定されます。組織に紐づくチームである必要があります。
teamIds または destinationTeamId のいずれか一方のみを指定してください。成功レスポンス (HTTP 200)
results array
userId、そのエントリに対して解決された teamIds、および該当行が失敗した場合は errorMessage を伴う status: "error"、成功した場合は status: "success" のいずれかが含まれます。destinationTeamId を指定して送信されたエントリには、teamIds の先頭チームである destinationTeamId も返されます。successCount 数値
status: "success" の行数。errorCount 数値
status: "error" の行数。- 提供状況: エンタープライズ限定
- 認証: Organization API key (Basic auth) 。このルートでは、キーに
members:*スコープが含まれている必要があります。admin:*を持つキーも使用できます。admin には members が含まれるためです。 - Organization の一致: body 内の
organizationIdは、API key と同じ organization である必要があります。一致しない場合、request は拒否されます。 - チームセット:
teamIdsは、call の実行後にその user が所属しているべきチームの正確な集合です。一覧に含まれていないチームからは user が削除されるため、維持したい場合は user の既存のチームもこの集合に含めてください。 - エントリごとに 1 つのチーム field: 各 entry では、
teamIdsまたはdestinationTeamIdのどちらか一方のみを指定してください。 - エントリごとのチーム数上限: 1 つの entry の
teamIdsに指定できるチームは最大 100 件です。 - 同期を成功させるには、ターゲット user がすでに organization の member である必要があります。
- 同期を成功させるには、entry 内のすべてのチームが organization に linked されている必要があります。
users内の 1 つの entry が失敗しても、他の entry は成功する場合があります。各resultsentry のstatusとerrorMessageを確認してください。- バッチサイズ: 1 回の request に含められる entry は最大 500 件です。必要に応じて、追加のバッチは別の request で送信してください。
curl -X POST https://api.cursor.com/organizations/team-memberships/sync \ -u YOUR_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "users": [ { "userId": 12345, "teamIds": [7, 8] }, { "userId": "user_abc123", "destinationTeamId": 8 } ] }'最初のエントリはユーザー 12345 を正確にチーム 7 と 8 に紐付けます (ユーザーがまだ所属していないチームを追加し、その他の紐付けられたチームを削除します) 。2番目のエントリは destinationTeamId を使用しており、teamIds: [8] を送信するのと同じです。
レスポンス:
{ "results": [ { "userId": 12345, "teamIds": [7, 8], "status": "success" }, { "userId": "user_abc123", "teamIds": [8], "destinationTeamId": 8, "status": "success" } ], "successCount": 2, "errorCount": 0}エラーレスポンス:
ほとんどのAPIエラーでは、HTTP 401、403、または 400 と、次のような形式のJSONボディが使用されます。
{ "code": "error", "message": "…"}404: 組織が見つかりません (このルートでは、message に別のフィールド名が使われます) :
{ "error": "Organization not found"}401: 無効な Organization API キー (キーが間違っているか、指定されていません) :
{ "code": "error", "message": "Invalid Organization API Key"}401: 必要なスコープが不足しています (キーは有効ですが、members:* または admin:* のスコープが含まれていません) :
{ "code": "error", "message": "Organization API key missing required scope: members:*"}403: organization がこの API キーと一致しません (body 内の organizationId は、この API キーに対応する組織ではありません) :
{ "code": "error", "message": "Not authorized"}400: 無効なリクエストボディ (例。失敗した各リクエストに該当するのは1つだけです) :
{ "code": "error", "message": "Request body is required"}{ "code": "error", "message": "organizationId is required"}{ "code": "error", "message": "users must be a non-empty array"}{ "code": "error", "message": "users must not contain more than 500 moves"}行ごとの失敗 (HTTP 200) : 単一エントリに対するバリデーションまたはビジネスルール違反は、results 内に status: "error" と errorMessage とともに返されます。以下の例では destinationTeamId を使用しているため、各行には destinationTeamId がそのまま含まれます。代わりに teamIds で送信されたエントリでは、teamIds がそのまま含まれます。userId / destinationTeamId の型が無効な場合は、行内の無効なフィールドに 0 が使われます。
{ "results": [ { "userId": 0, "destinationTeamId": 7, "status": "error", "errorMessage": "Invalid userId" } ], "successCount": 0, "errorCount": 1}{ "results": [ { "userId": 12345, "destinationTeamId": 0, "status": "error", "errorMessage": "Invalid destinationTeamId" } ], "successCount": 0, "errorCount": 1}{ "results": [ { "userId": 0, "destinationTeamId": 0, "status": "error", "errorMessage": "Invalid userId. Invalid destinationTeamId" } ], "successCount": 0, "errorCount": 1}行ごとの失敗 (HTTP 200): 入力の型が適切でも変更を適用できない場合、同期ロジックで発生します:
{ "results": [ { "userId": 12345, "destinationTeamId": 999, "status": "error", "errorMessage": "Team is not linked to this organization" } ], "successCount": 0, "errorCount": 1}{ "results": [ { "userId": 12345, "destinationTeamId": 7, "status": "error", "errorMessage": "User is not a member of this organization" } ], "successCount": 0, "errorCount": 1}{ "results": [ { "userId": 12345, "destinationTeamId": 7, "status": "error", "errorMessage": "User not found" } ], "successCount": 0, "errorCount": 1}利用
組織に紐づくすべてのチームの利用状況をレポートします。これらのエンドポイントは organization pool 内の全チームのデータを集計するため、チームごとに個別の Team API キー は必要ありません。単一チームのレポートには、代わりにチームの Admin API の利用エンドポイントを使用してください。
- Availability: エンタープライズのみ
- 認証: Organization API キー (Basic auth) 。これらのルートでは、キーに
usage:*スコープが含まれている必要があります。admin:*を持つキーも使用できます。admin には usage が含まれるためです。 - Organization match: body 内の
organizationIdは、API key と同じ組織のものである必要があります。そうでない場合、request は拒否されます。 - Team containment:
teamIds内の各項目は、その組織に属している必要があります。組織外の team を参照する request は拒否されます。 - Polling: 利用データは時間単位で集計されます。これらのエンドポイントの poll は、最大でも 1 時間に 1 回にしてください。レート制限は 1 分あたり 20 requests です。rate limits and best practicesを参照してください。
プール型利用を取得
/organizations/pooled-usage組織のプール型利用を取得します。プールの支出上限、組織全体の合計利用額、チームごとの内訳を返します。これはダッシュボードのプール型利用セクションで使用されます。金額フィールドはすべてセント単位です。
リクエスト本文
organizationId string 必須
org_abc123) 。エンドポイントの呼び出しに使用する Organization API キー の組織と一致している必要があります。レスポンスフィールド
pool object
limitCentsnumber - 組織のプール型支出上限 (セント単位)usedCentsnumber - 現在までに消費されたプール型利用の合計 (セント単位)remainingCentsnumber - プールの残り予算 (limitCentsからusedCentsを引いた値、セント単位)contractStartDatestring | null - 現在の契約期間の開始を示す ISO 8601 タイムスタンプ。契約日が設定されていない場合はnullcontractEndDatestring | null - 現在の契約期間の終了を示す ISO 8601 タイムスタンプ。契約日が設定されていない場合はnull
teams array
usedCents の合計は pool.usedCents と一致します。各 object には以下が含まれます:teamIdnumber - 組織に紐づくチームの整数 IDusedCentsnumber - 現在の契約期間中にこのチームが消費した利用額 (セント単位)budgetLimitCentsnumber | undefined - チームごとの予算上限 (セント単位) 。このチームに予算が設定されている場合にのみ含まれます。
curl -X POST https://api.cursor.com/organizations/pooled-usage \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123" }'レスポンス:
{ "pool": { "limitCents": 5000000, "usedCents": 1862340, "remainingCents": 3137660, "contractStartDate": "2026-01-01T00:00:00.000Z", "contractEndDate": "2026-12-31T23:59:59.999Z" }, "teams": [ { "teamId": 7, "usedCents": 1440100, "budgetLimitCents": 2000000 }, { "teamId": 8, "usedCents": 422240 } ]}利用イベントを取得する
/organizations/filtered-usage-events組織に紐づくチーム全体の詳細な使用状況イベントを取得します。これはチームの /teams/filtered-usage-events エンドポイントに対応する組織全体版で、同じイベント形式を返し、各イベントには所有チームの teamId がタグ付けされます。
デフォルトでは、organization pool に含まれる すべての チームのイベントが返されます。teamIds を渡すと、返されるレスポンスを特定のチームに限定できます。
コスト計算: イベントレベルのコストを /organizations/pooled-usage のチームごとの usedCents の内訳と突き合わせるには、各イベントの chargedCents フィールドを合計します。このフィールドには、リクエストがそのレートの対象となる場合、モデルのコストと Cursorトークンレートの両方が含まれます。
cursorTokenFee フィールドは Cursorトークンレートを表し、サードパーティモデルのリクエストにこのレートが適用される場合にのみ含まれます。これには、Auto がサードパーティモデルにルーティングする場合も含まれます。Grok や Composer などのファーストパーティの Cursor モデル、およびリクエストベースのエンタープライズアカウントには、この料金は含まれません。Cursorトークンレートを参照してください。
リクエストボディ
organizationId string 必須
org_abc123)。エンドポイントを呼び出すために使用する Organization API キーの組織と一致している必要があります。teamIds number[]
startDate number
endDate number
userId number
email string
serviceAccountId string
page number
1pageSize number
10レスポンスフィールド
usageEvents の各オブジェクトには、チームのエンドポイントと同じフィールドに加えて、所有チームのタグが含まれます。
teamIdnumber - このイベントを所有するチームの整数IDtimestampstring - エポックミリ秒単位のイベントタイムスタンプ (文字列)userEmailstring - リクエストを送信したユーザーのメールアドレスserviceAccountIdstring | undefined - リクエストを行ったサービスアカウントの ID。人間のユーザーによるイベントでは省略されます。serviceAccountNamestring | undefined - リクエストを行ったサービス アカウントの表示名。人間のユーザーによるイベントでは省略されます。modelstring - リクエストで使用するAIモデルkindstring - 請求種別 (例:Usage-based,Included in Business)maxModeboolean - リクエストで Max Mode が使用されたかどうかrequestsCosts数値 - リクエスト単位のコストisTokenBasedCallboolean - リクエストがトークン利用に基づいて課金されたかどうかisChargeableboolean - このイベントに料金が発生するかどうかisHeadlessブール値 - このリクエストが接続済みのクライアントを介さずに行われたかどうか (例: バックグラウンドエージェント)tokenUsageobject | undefined - トークン利用の詳細 (isTokenBasedCallがtrueの場合に含まれます) :inputTokensnumber - 消費された入力トークン数outputTokensnumber - 生成された出力トークン数cacheWriteTokensnumber - キャッシュに書き込まれたトークン数cacheReadTokensnumber - キャッシュから読み取られたトークン数totalCentsnumber - モデルの総コスト (セント単位)discountPercentOffnumber | undefined - 適用された割引率 (存在する場合)
chargedCentsnumber - このイベントで請求された合計金額 (セント単位)。Cursorトークンレートの対象となるサードパーティモデルのリクエストでは、モデルコストと Cursorトークンレートが含まれます。cursorTokenFeenumber | undefined - セント単位のCursorトークンレート。サードパーティモデルのリクエストにレートが適用される場合 (Auto がサードパーティモデルにルーティングする場合を含む) にのみ含まれます。
# 組織プール内の全チームのイベントcurl -X POST https://api.cursor.com/organizations/filtered-usage-events \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "startDate": 1748411762359, "endDate": 1751003762359, "page": 1, "pageSize": 25 }'# 特定のチームに限定したイベントcurl -X POST https://api.cursor.com/organizations/filtered-usage-events \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "teamIds": [7, 8], "startDate": 1748411762359, "endDate": 1751003762359, "page": 1, "pageSize": 25 }'レスポンス:
{ "totalUsageEventsCount": 113, "pagination": { "numPages": 12, "currentPage": 1, "pageSize": 10, "hasNextPage": true, "hasPreviousPage": false }, "usageEvents": [ { "teamId": 7, "timestamp": "1750979225854", "userEmail": "developer@company.com", "model": "claude-4.5-sonnet", "kind": "Usage-based", "maxMode": true, "requestsCosts": 5, "isTokenBasedCall": true, "isChargeable": true, "isHeadless": false, "tokenUsage": { "inputTokens": 126, "outputTokens": 450, "cacheWriteTokens": 6112, "cacheReadTokens": 11964, "totalCents": 20.18232 }, "chargedCents": 21.36232, "cursorTokenFee": 1.18 }, { "teamId": 8, "timestamp": "1750978339901", "userEmail": "admin@company.com", "model": "claude-4-sonnet-thinking", "kind": "Included in Business", "maxMode": true, "requestsCosts": 1.4, "isTokenBasedCall": false, "isChargeable": false, "isHeadless": false, "chargedCents": 8 } ], "period": { "startDate": 1748411762359, "endDate": 1751003762359 }}日次利用データを取得する
/organizations/daily-usage-dataorganizationに紐づく全チームのメンバーごとの日次利用メトリクスを取得します。これはチームの /teams/daily-usage-data endpointに対応するorganization全体版であり、各行には所属する teamId が付与されます。結果はユーザー単位でページネーションされ、指定した日付範囲内にmembershipを持つ全メンバーのデータを返します。page と pageSize を使用してページを切り替えてください。
リクエストボディ
organizationId string 必須
org_abc123) 。エンドポイントを呼び出す際に使用する Organization API キーの組織と一致している必要があります。startDate number
endDate number
teamIds number[]
page number
1pageSize number
1000userEmail string
userEmails はエイリアスとして使用できます。日付範囲は30日を超えられません。より長い期間を指定する場合は、複数回に分けてリクエストしてください。
subscriptionIncludedReqs、usageBasedReqs、apiKeyReqs の各フィールドがカウントするのは、以前のリクエストベースの料金体系における請求対象のリクエスト単位ではなく、生の利用イベントです。
レスポンスフィールド
data 配列内の各オブジェクトには、チームの日次利用 endpointと同じフィールドに加え、teamId が含まれます。主なフィールド:
userId文字列 -user_プレフィックスが付いたエンコード済みのユーザー ID (例:user_abc123)teamIdnumber - この行が属する組織に紐づくチームのIDdaystring - このレコードの対象日 (ISO日付、例:2024-03-18)datenumber - エポックミリ秒形式の日付emailstring - ユーザーのメールアドレスisActiveboolean - その日にユーザーのアクティビティがあったかどうかtotalLinesAddednumber - 追加されたコードの総行数totalLinesDeleted数値 - 削除されたコードの合計行数acceptedLinesAddednumber - AI が提案し、受け入れられた追加行数acceptedLinesDeleted数値 - 承認されたAI提案による削除行数totalApplies数値 - AIによるコード適用アクションの合計数totalAccepts数値 - 採用されたAI提案の合計数totalRejectsnumber - 拒否されたAI提案の総数totalTabsShownnumber - ユーザーに表示された Tab completion の合計数totalTabsAcceptednumber - ユーザーが受け入れた Tab 補完の合計数composerRequests数値 - 行われた Composer リクエストの数chatRequests数値 - チャット リクエストの件数agentRequestsnumber - Agentモードのリクエスト数cmdkUsages数値 - Cmd+K の Inline edit の利用回数subscriptionIncludedReqsnumber - サブスクリプションプランに含まれるリクエスト数apiKeyReqsnumber - APIキー経由で行われたリクエスト数usageBasedReqsnumber - 従量課金 (超過分) のリクエストbugbotUsagesnumber - Bugbotの利用回数mostUsedModelstring | null - その日に最もよく使用されたAIモデルapplyMostUsedExtensionstring | null - apply アクションで最もよく使われるファイル拡張子tabMostUsedExtensionstring | null - Tab補完で最もよく使われるファイル拡張子clientVersionstring | null - 使用されたCursorクライアントのバージョン
レスポンスには、pagination オブジェクト (page、pageSize、totalUsers、totalPages、hasNextPage、hasPreviousPage) と period オブジェクト (startDate、endDate) も含まれます。
curl -X POST https://api.cursor.com/organizations/daily-usage-data \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "startDate": 1710720000000, "endDate": 1710892800000, "page": 1, "pageSize": 1000 }'レスポンス:
{ "data": [ { "userId": "user_abc123", "teamId": 101, "day": "2024-03-18", "date": 1710720000000, "isActive": true, "totalLinesAdded": 1543, "totalLinesDeleted": 892, "acceptedLinesAdded": 1102, "acceptedLinesDeleted": 645, "totalApplies": 87, "totalAccepts": 73, "totalRejects": 14, "totalTabsShown": 342, "totalTabsAccepted": 289, "composerRequests": 45, "chatRequests": 128, "agentRequests": 12, "cmdkUsages": 67, "subscriptionIncludedReqs": 180, "apiKeyReqs": 0, "usageBasedReqs": 5, "bugbotUsages": 3, "mostUsedModel": "gpt-5", "applyMostUsedExtension": ".tsx", "tabMostUsedExtension": ".ts", "clientVersion": "0.25.1", "email": "developer@company.com" } ], "period": { "startDate": 1710720000000, "endDate": 1710892800000 }, "pagination": { "page": 1, "pageSize": 1000, "totalUsers": 150, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}支出データを取得
/organizations/spend組織にリンクされたチーム全体について、メンバーごとの支出を取得します。これはチーム向け/teams/spendエンドポイントの組織全体版で、各メンバーにはその所属元のteamIdが付与されます。チームのエンドポイントとは異なり、支出は/organizations/pooled-usageと同じ含まれる支出の定義を使用して組織の契約期間全体でレポートされるため (チームごとの請求サイクルではありません) 、数値はプールと整合します。
リクエスト本文
organizationId string 必須
org_abc123) 。エンドポイントの呼び出しに使用するOrganization API keyの組織と一致している必要があります。teamIds number[]
sortBy string
email、name、spendCents。デフォルト: emailsortDirection string
asc、desc。デフォルト: ascpage number
1pageSize number
100支出は組織のプール内のチーム全体で集計されるため、/teams/spendにある単一チーム向けのフィールドsubscriptionCycleStart、overallSpendCents、fastPremiumRequests、hardLimitOverrideDollars、monthlyLimitDollarsは含まれません。レポート対象期間はperiodで返されます。
レスポンスフィールド
teamMemberSpend内の各オブジェクトには以下が含まれます。
userIdstring -user_プレフィックス付きのエンコードされたユーザーID (例:user_abc123)teamIdnumber - このメンバーが所属する組織にリンクされたチームのIDnamestring - ユーザーの表示名emailstring - ユーザーのメールアドレスrolestring - チーム内のロール (例:member、owner)spendCentsnumber - 組織の契約期間中にこのメンバーに割り当てられた、含まれるプール支出 (セント単位)
レスポンスには、totalMembers (number) 、totalPages (number) 、および組織の契約期間を示すperiodオブジェクト (startDate、endDateはepochミリ秒) も含まれます。
curl -X POST https://api.cursor.com/organizations/spend \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "sortBy": "spendCents", "sortDirection": "desc", "page": 1, "pageSize": 25 }'レスポンス:
{ "teamMemberSpend": [ { "userId": "user_abc123", "teamId": 101, "name": "Alex", "email": "developer@company.com", "role": "member", "spendCents": 2450 }, { "userId": "user_def456", "teamId": 202, "name": "Sam", "email": "admin@company.com", "role": "owner", "spendCents": 1875 } ], "totalMembers": 15, "totalPages": 1, "period": { "startDate": 1735689600000, "endDate": 1767225600000 }}モデルアクセス
モデルアクセスルートはプレビュー段階であり、変更される可能性があります。一般提供開始前に、パス、レスポンスフィールド、エラー動作が変わる場合があります。
組織にリンクされたチームのモデルアクセスポリシーを取得・更新します。これらのルートは、リンクされたチームにスコープを限定したチームモデルアクセス API に対応しています。
一覧とチームごとの GET を使用して設定の乖離を検出します。設定 PUT とプロバイダー/モデルのトグル (モデルごとの parameters を含む) を使用してチーム間の設定を整合させます。組織レベルのコピーエンドポイントやポリシーフィンガープリントはありません。
パラメーター設定なしでモデルを有効にすると、カタログのデフォルトのままになります。Fast などのデフォルトが組織のポリシーと一致しない場合は、一括モデルルートを使用してください。
数値の teamId は、GET /organizations/members などのルートから取得します。
- 利用可能性: エンタープライズ組織。対象チームではモデルアクセス制御が有効になっている必要があります。
- 認証: Organization API キー (Basic auth) 。読み取りには
models:readが必要です。書き込みにはmodels:*が必要です。admin:*を持つキーはどちらにも使用できます。members:*、usage:*、read:*を持つキーでは、これらのルートを呼び出せません。 - チームの��属: すべての
teamIdは組織にリンクされている必要があります。単一チームのルートでは、不明なチームまたはリンクされていないチームは 404 を返します。一括ルートでは、リンクされていないチームは HTTP 200 のエラー行として返されます。 - 設定を先に実施: チームがまだ
unrestricted(またはlegacy) の場合、プロバイダーおよびモデルの読み取りと書き込みは 409 を返します。まずPUT /organizations/teams/{teamId}/model-access/configuration(または一括設定ルート) でカスタムポリシーを作成してください。最初のデフォルト PUT はカタログのデフォルトを設定しますが、別のチームのオン/オフ設定を複製するものではありません。 - unrestricted に戻す: チームごとまたは一括の設定 PUT で
{ "state": "unrestricted" }を送信します。 - 一括処理の部分的な成功: 一括ルートは最大 100 個の
teamIdsを受け付け、一部の行が失敗しても、バッチが処理されると常に HTTP 200 を返します。errorCountとすべてのresults[].statusを確認してください。���功した行はロールバックされません。操作はチームごとに冪等であるため、失敗したteamIdのみを再試行してください。4xx または 5xx のレスポンスではリクエスト全体が拒否され、変更は適用されません。レスポンスの構造は/organizations/team-memberships/syncと一致します。 - レート制限: 1 分あたり 20 リクエスト。書き込みはチーム監査ログに
team_settingsイベントとして表示されます。レート制限とベストプラクティスを参照してください。
モデルアクセス設定を一覧表示
/organizations/teams/model-access/configurationリンクされたチームのモデルアクセス設定を一覧表示します。制限なしポリシーとカスタムポリシーの乖離を確認するために使用します。オン/オフ設定の乖離については、各チームのプロバイダーを GET して比較します。
リンクされたチームでモデルアクセス制御が有効になっていない場合でも、その行は HTTP 200 となり、state/デフォルト値の代わりに errorMessage が含まれます。そのチームに対するチームごとの GET および書き込みルートは 403 を返します。
クエリパラメータ
page number
pageSize number
teamIds string
7,8,9。curl -X GET "https://api.cursor.com/organizations/teams/model-access/configuration?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:レスポンス:
{ "teams": [ { "teamId": 7, "teamName": "Platform", "state": "custom", "newProviderDefault": "disabled", "newModelDefault": "enabled" }, { "teamId": 8, "teamName": "Mobile", "state": "custom", "newProviderDefault": "disabled", "newModelDefault": "enabled" }, { "teamId": 9, "teamName": "Data", "state": "unrestricted", "newProviderDefault": null, "newModelDefault": null }, { "teamId": 10, "teamName": "Research", "errorMessage": "Model access control is not available for this team" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 4, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}チームのモデルアクセス設定を取得
/organizations/teams/:teamId/model-access/configurationリンクされた 1 つのチームの設定を取得します。
パラメータ
teamId number 必須
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY:チームのモデルアクセス設定を更新
/organizations/teams/:teamId/model-access/configurationリンクされたチームのモデルアクセス設定を作成または更新するか、チームを無制限に戻します。リクエストボディと初期設定時の挙動はチームルートと同じです。
パラメータ
teamId number 必須
リクエスト本文
state string
unrestricted を使用します。デフォルトを送信する場合は省略します。newProviderDefault string
enabled または disabled。カスタムポリシーを作成または更新する場合は必須です。state が unrestricted の場合は省略します。newModelDefault string
enabled または disabled。カスタムポリシーを作成または更新する場合は必須です。state が unrestricted の場合は省略します。curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "newProviderDefault": "disabled", "newModelDefault": "enabled" }'リンクされたチームを無制限に戻す:
curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "state": "unrestricted" }'モデルアクセス設定を一括更新
/organizations/teams/model-access/configuration複数のリンクされたチームの設定を作成または更新するか、アクセス制限なしの状態に戻します。1 回のリクエストで指定できる teamIds は最大 100 件です。
HTTP 200 はバッチが処理されたことを示すだけで、すべての行が成功したことを示すものではありません。errorCount と各 results[].status を確認してください。成功したチームには新しい設定が適用されます。この操作はチームごとに冪等であるため、失敗した teamId のみ再試行してください。4xx または 5xx のレスポンスではリクエスト全体が拒否され、変更は適用されません。
リクエスト本文
teamIds number[] 必須
state string
unrestricted を指定します。デフォルトを送信する場合は省略してください。newProviderDefault string
enabled または disabled。カスタムポリシーを作成または更新する場合は必須です。state が unrestricted の場合は省略してください。newModelDefault string
enabled または disabled。カスタムポリシーを作成または更新する場合は必須です。state が unrestricted の場合は省略してください。複数のチームにカスタムポリシーのデフォルトを設定します。
curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "newProviderDefault": "disabled", "newModelDefault": "enabled" }'複数のチームをアクセス制限なしの状態に戻します。
curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "state": "unrestricted" }'レスポンス:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "Team is not linked to this organization" } ], "successCount": 2, "errorCount": 1}チームのモデルアクセスプロバイダーを取得
/organizations/teams/:teamId/model-access/providersリンクされたチームのプロバイダーとモデルを、モデルごとの parameters (チームのプロバイダールートと同じ形式) を含めて一覧表示します。チームにカスタムポリシーがない場合は 409 を返します。
パラメータ
teamId number 必須
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/providers \ -u YOUR_ORGANIZATION_API_KEY:チームのモデルアクセスプロバイダーを更新
/organizations/teams/:teamId/model-access/providers/:providerリンクされたチームでプロバイダーを有効または無効にします。チームにカスタムポリシーがない場合は 409 を返します。
パラメータ
teamId number 必須
provider string 必須
openai) 。リクエスト本文
enabled boolean 必須
curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/openai \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{"enabled": false}'チームのモデルアクセスモデルを更新
/organizations/teams/:teamId/model-access/providers/:provider/models/:modelリンクされたチームでモデルを有効または無効にし、必要に応じてモデルごとの parameters を設定します (チームモデルルートと同じリクエスト本文) 。チームにカスタムポリシーがない場合は 409 を返します。
パラメータ
teamId number 必須
provider string 必須
anthropic) 。model string 必須
claude-opus-4-6) 。リクエスト本文
enabled boolean 必須
parameters object
{ allowedValues, defaultValue } への任意のマップ。省略したフィールドは変更されません。allowedValues: null を指定すると制限がクリアされます。defaultValue: null を指定するとカタログのデフォルトに戻ります。チームの モデルアクセスモデルを更新 ドキュメントを参照してください。リンクされたチームで Fast を無効化:
curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/anthropic/models/claude-opus-4-6 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "enabled": true, "parameters": { "fast": { "allowedValues": ["false"] } } }'デフォルトの推論 effort を設定:
curl -X PUT https://api.cursor.com/organizations/teams/7/model-access/providers/openai/models/gpt-5.4 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "enabled": true, "parameters": { "reasoning": { "allowedValues": ["low", "medium", "high"], "defaultValue": "high" } } }'モデルアクセスプロバイダーを一括更新
/organizations/teams/model-access/providers/:provider複数のリンクされたチームでプロバイダーを有効または無効にします。1回のリクエストで指定できる teamIds は最大100件です。
HTTP 200 は、バッチが処理されたことを示すだけで、すべての行が成功したことを意味するわけではありません。errorCount と各 results[].status を確認してください。成功した行はロールバックされません。操作はチームごとに冪等であるため、失敗した teamId のみを再試行してください。4xx または 5xx のレスポンスではリクエスト全体が拒否され、変更は適用されません。
パラメータ
provider string 必須
openai) 。リクエスト本文
enabled boolean 必須
teamIds number[] 必須
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": false }'レスポンス:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "Team has no model access policy. Create one with PUT /teams/model-access/configuration, or enable model access in Team Settings → Models." } ], "successCount": 2, "errorCount": 1}この例でも、���ッチが完了したため HTTP ステータスは 200 です。チーム7と8ではプロバイダーは無効のままです。チーム9は設定を作成してから再試行してください。
モデルアクセスモデルを一括更新
/organizations/teams/model-access/providers/:provider/models/:model複数のリンクされたチームでモデルを有効または無効にします。必要に応じて、単一チームのモデル PUT と同じparametersマップを指定できます。1回のリクエストで指定できるteamIdsは最大100件です。
HTTP 200 は、すべての行が成功したことではなく、バッチが処理されたことを意味します。errorCountと各results[].statusを確認してください。成功した行はロールバックされません。この操作はチームごとに冪等であるため、失敗したteamIdのみ再試行してください。4xx または 5xx のレスポンスではリクエスト全体が拒否され、変更は適用されません。
パラメータ
provider string 必須
anthropic) 。model string 必須
claude-opus-4-6) 。リクエスト本文
enabled boolean 必須
teamIds number[] 必須
parameters object
allowedValues: nullで制限を解除します。defaultValue: nullでカタログのデフォルトに戻します。リンクされたチーム全体で Fast を無効にする:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/anthropic/models/claude-opus-4-6 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": true, "parameters": { "fast": { "allowedValues": ["false"] } } }'リンクされたチーム全体でデフォルトの推論の労力を固定する:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai/models/gpt-5.4 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": true, "parameters": { "reasoning": { "allowedValues": ["low", "medium", "high"], "defaultValue": "high" } } }'レスポンス:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "Team has no model access policy. Create one with PUT /teams/model-access/configuration, or enable model access in Team Settings → Models." } ], "successCount": 2, "errorCount": 1}エラー
エラー本文には以下を使用します。
{ "code": "error", "message": "…" }| ステータス | 発生条件 |
|---|---|
401 | キーが不正、または models:read / models:* (または admin:*) がない |
403 | そのチームではモデルアクセス制御を利用できない (単一チームルート) |
404 | チームが組織にリンクされていない (単一チームルート) |
409 | そのチームの state が unrestricted または legacy のときにプロバイダーまたはモデルを読み取った、または単一チームへの書き込みを行った |
400 | 不明なプロバイダー、モデル、パラメーター ID、またはパラメーター値、無効なリクエスト本文、空の allowedValues、allowedValues 外のデフォルト、有効なモデルバリアントに解決されない設定、または Smart Auto で必須のモデルがブロックされる |
組織向けの一括ルート (teamIds を含む PUT .../providers/:provider、PUT .../providers/:provider/models/:model、および PUT .../configuration) は、一部の行が失敗しても、バッチが処理されると HTTP 200 を返します。errorCount がゼロ以外でも、HTTP レスポンスは成功です。リンクされていないチームや設定不足などの公開エラーは、status: "error" の行として表示されます。成功した行はロールバックされません。操作はチームごとに冪等です。そのため、失敗した teamId のみを再試行してください。4xx または 5xx のレスポンスは、リクエスト全体が拒否され、変更が適用されなかったことを意味します。リンクされたチームが設定を読み込めない場合、リストルートも errorMessage 行を含む HTTP 200 を返します。
組織グループ
組織グループを使うと、同じ組織に紐づく複数のチームにまたがるメンバーを整理できます。ダッシュボードのセットアップとグループレベルの制御については、組織グループ を参照してください。
- 認証: Organization API キー (Basic auth) 。読み取りルートには
members:*スコープが必要です。書き込みルートでもmembers:*が必要です。admin:*を持つキーも使用できます。admin には members が含まれるためです。 - グループ ID: 組織グループ ID には
g_プレフィックスを使用します。 - ページネーション: 一覧ルートでは
pageとpageSizeを受け付けます。どちらの値も正の整数である必要があります。
組織グループを一覧表示
/organizations/groupsAPI キーに紐づく組織の組織グループを取得します。
クエリパラメータ
page number
pageSize number
curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:レスポンス:
{ "groups": [ { "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy", "name": "Engineering", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-20T14:22:00.000Z" }, { "id": "g_kljUvI0ASZORvSEXf9hV0ydcso", "name": "Design", "createdAt": "2026-01-16T09:00:00.000Z", "updatedAt": "2026-01-16T09:00:00.000Z" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}組織グループを取得
/organizations/groups/:groupId単一の組織グループを取得します。
パラメータ
groupId string 必須
g_ プレフィックスが付いた組織グループ ID。curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \ -u YOUR_ORGANIZATION_API_KEY:レスポンス:
{ "group": { "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy", "name": "Engineering", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-20T14:22:00.000Z" }}組織グループ メンバーの一覧
/organizations/groups/:groupId/members組織グループ内のメンバーを取得します。
パラメータ
groupId string 必須
g_ プレフィックス付きの組織グループ ID。クエリパラメータ
page number
pageSize number
curl -X GET "https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:レスポンス:
{ "members": [ { "userId": "user_abc123", "name": "Alex Developer", "email": "alex@company.com", "joinedAt": "2026-01-15T10:30:00.000Z" }, { "userId": "user_def456", "name": "Sam Engineer", "email": "sam@company.com", "joinedAt": "2026-01-16T09:15:00.000Z" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}組織グループ メンバーの追加
/organizations/groups/:groupId/members/bulk-add組織グループにメンバーを追加します。
パラメータ
groupId string 必須
g_ プレフィックス付きの組織グループ ID。リクエスト本文
userIds string[] 必須
user_ 接頭辞付きの公開 user ID の配列。1回のリクエストには最大100ユーザーまで含められます。curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-add \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "userIds": ["user_abc123", "user_def456"] }'レスポンス:
{ "addedCount": 2}組織グループ メンバーの削除
/organizations/groups/:groupId/members/bulk-remove組織グループからメンバーを削除します。
パラメータ
groupId string 必須
g_ プレフィックス付きの組織グループ ID。リクエスト本文
userIds string[] 必須
user_ プレフィックス付きの公開ユーザー ID の配列。1 回のリクエストで最大 100 人のユーザーを指定できます。curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-remove \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "userIds": ["user_def456"] }'レスポンス:
{ "removedCount": 1}