Skip to main content

Command Palette

Search for a command to run...

API

API организации

API организации позволяет выполнять действия, применимые ко всем командам, связанным с организацией, например перемещать пользователей между этими командами, формировать отчеты о пуле использования в командах, управлять группами организации, а также просматривать или обновлять доступ к моделям. Для этого используются API-ключ организации и те же шаблоны HTTP, что и Admin API команды.

  • API организации использует базовую аутентификацию, где в качестве имени пользователя выступает ваш API-ключ.
  • Подробнее о создании API-ключей, методах аутентификации, ограничении частоты запросов и рекомендациях по лучшим практикам см. в разделе Обзор API.

API-ключи организации и команды

API-ключи организации — это учетные данные, действующие на уровне организации. API-ключи команды — это учетные данные, действующие на уровне команды.

Используйте API-ключ организации при вызове конечных точек уровня организации, таких как /organizations/team-memberships/sync, /organizations/pooled-usage и /organizations/groups.

Используйте API-ключ команды при вызове конечных точек уровня команды в /teams/* (например, /teams/members и /teams/spend).

Ключевые различия

  • Область действия: API-ключи организации могут действовать во всех командах, связанных с одной и той же организацией. API-ключи команды могут действовать только в рамках одной команды.
  • Совместимость с конечными точками: Для конечных точек организации требуются API-ключи организации. Для конечных точек команды требуются API-ключи команды.
  • Области действия ключей: Для каждого маршрута требуется определённая область действия ключа. Маршруты участников в режиме только для чтения принимают members:read; для маршрутов записи участников и групп нужен members:*; для маршрутов использования нужен usage:*. Ключи с admin:* работают везде, потому что admin подразумевает и остальные области действия.
  • Ошибки авторизации: Если область действия ключа не соответствует области действия конечной точки, запросы завершаются ошибками аутентификации или авторизации (обычно 401 или 403).

Области действия

Каждый API-ключ организации имеет ровно одну область действия. Маршрут доступен, только если его покрывает область действия ключа. Более широкие области действия включают всё, что разрешают более узкие.

Область действияДоступПримеры маршрутов
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Доступ только для чтения к конфигурации Model Access и спискам поставщиков.GET /organizations/teams/model-access/configuration, GET /organizations/teams/{teamId}/model-access/configuration, GET /organizations/teams/{teamId}/model-access/providers
models:*Доступ на чтение и запись к Model Access. Включает всё, что разрешает models:read.Все маршруты Model Access, включая массовое переключение поставщиков и моделей и массовую конфигурацию
admin:*Полный доступ ко всем маршрутам организации.Всё вышеперечисленное

Выбирайте минимально необходимую область действия для задачи. Используйте members:read для интеграций только для чтения, которые выводят список участников, но не изменяют членство в организации. Используйте models:read или models:* для автоматизации Model Access без предоставления полного доступа администратора. Вы можете выбрать эти области действия, когда создаёте API-ключ организации в дашборде.

Как передавать API-ключ организации?

Передавайте его так же, как и другие API-ключи Cursor: через базовую аутентификацию, где ключ используется как имя пользователя, а пароль остаётся пустым.

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 }    ]  }'

Участники

Просмотр участников организации и их перемещение между командами, связанными с вашей организацией.

Список участников организации

GET/organizations/members

Возвращает участников организации, связанной с вашим API-ключом, а также роль каждого участника в организации и его назначения в связанных командах. Результаты поддерживают пагинацию.

Параметры запроса

page number

Номер страницы (нумерация с 1). По умолчанию — первая страница.

pageSize number

Количество участников на странице. Максимум — 200; значения больше 200 приводятся к 200.

Поля ответа

members array

Массив объектов участников организации, каждый из которых содержит:
  • userId number - Уникальный числовой идентификатор участника, совпадающий с id, возвращаемым эндпоинтом команды GET /teams/members
  • email string - Адрес электронной почты участника
  • name string - Отображаемое имя участника
  • organizationRole string - Роль на уровне организации: admin или member. Она отличается от teamRole в назначениях команд: пользователь может быть admin в организации, но иметь роль member в конкретной команде, и наоборот.
  • teams array - Назначения участника в командах, связанных с организацией. Каждый object содержит:
    • teamId number - Целочисленный ID связанной команды, в которую входит участник
    • teamRole string - Роль в этой команде (например, 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  }}

Синхронизация участников команд организации

POST/organizations/team-memberships/sync

Задайте команды, к которым принадлежат один или несколько пользователей в вашей организации. Это соответствует массовому формату API импорта CSV: вы отправляете массив пользователей и получаете строку результата для каждого из них.

Каждая запись должна содержать ровно одно из полей teamIds или destinationTeamId:

  • teamIds — это полный набор идентификаторов команд, в которые должен входить пользователь. Эндпоинт приводит участие пользователя в командах в точное соответствие с этим набором. Он добавляет пользователя во все перечисленные команды, в которых его еще нет, и удаляет его из всех команд, не указанных в списке. Чтобы во время миграции оставить пользователя в текущей команде и одновременно добавить в другую, укажите обе (например, [oldTeamId, newTeamId]).
  • destinationTeamId помещает пользователя в одну команду. Пользователь добавляется в указанную команду и удаляется из всех остальных. Задание destinationTeamId: NNN функционально эквивалентно teamIds: [NNN].

Тело запроса

organizationId string Обязательно

Публичный идентификатор организации (например, org_abc123). Должен соответствовать организации для API-ключа Organization, используемого при вызове эндпоинта.

users array Обязательно

Непустой список записей (не более 500 в одном запросе). Каждый элемент — объект с идентификатором пользователя и ровно одним полем команды (teamIds или destinationTeamId):
  • userId number | string: ID пользователя, которого нужно синхронизировать. Принимает либо целочисленный ID (например, 12345), либо строковый идентификатор (например, "user_abc123").
  • teamIds number[]: Полный набор идентификаторов связанных с организацией команд, в которые пользователь должен входить после синхронизации. Состав команд приводится в точное соответствие с этим набором. Любая команда, не указанная в списке, будет удалена. Чтобы сохранить текущие команды пользователя, включите их в список (например, [7, 8]). Не более 100 команд на запись.
  • destinationTeamId number: Поле для синхронизации с одной командой. Параметр destinationTeamId: NNN эквивалентен отправке teamIds: [NNN]. Пользователь будет состоять только в этой команде. Это должна быть команда, привязанная к организации.
Укажите ровно одно из полей teamIds или destinationTeamId для каждой записи.

Успешный ответ (HTTP 200)

results array

По одной записи на каждый запрошенный синхронный запрос, в порядке следования. Каждый объект включает userId, рассчитанные teamIds для этой записи и либо status: "success", либо status: "error" с errorMessage, если обработка строки завершилась ошибкой. Записи, отправленные с destinationTeamId, т��кже дублируют destinationTeamId (первая команда в teamIds).

successCount number

Количество строк со статусом status: "success".

errorCount number

Количество строк со значением status: "error".
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 (добавляя в любую команду, в которой пользователь ещё не состоит, и удаляя все остальные связанные команды). Вторая запись использует 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: организация не найдена (в этом маршруте используется другое имя поля для сообщения):

{  "error": "Organization not found"}

401: неверный API-ключ API организации (ключ указан неверно или отсутствует):

{  "code": "error",  "message": "Invalid Organization API Key"}

401: отсутствует необходимый scope (ключ действителен, но не включает members:* или admin:*):

{  "code": "error",  "message": "Organization API key missing required scope: members:*"}

403: организация не совпадает с ключом (organizationId в теле запроса не соответствует организации для этого API-ключа):

{  "code": "error",  "message": "Not authorized"}

400: некорректное тело запроса (примеры; для каждого неудачного запроса подходит только один вариант):

{  "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}

Использование

Просматривайте данные об использовании по всем командам, связанным с вашей организацией. Эти конечные точки агрегируют данные всех команд из пула организации, поэтому отдельный API-ключ команды для каждой команды не нужен. Для отчетности по одной команде используйте конечные точки использования Admin API команды.

Получить данные о пуле использования

POST/organizations/pooled-usage

Получить данные о пуле использования организации: лимит расходов пула, общее использование по организации и разбивку по командам. Эти данные используются в разделе пула использования на дашборде. Все денежные поля указаны в центах.

Тело запроса

organizationId string Обязательно

Публичный ID организации (например, org_abc123). Должен совпадать с организацией, для которой используется API-ключ организации при вызове эндпоинта.

Поля ответа

pool object

Сводные значения на уровне пула за текущий контрактный период:
  • limitCents number - Лимит расходов пула для организации в центах
  • usedCents number - Общий объём использования из пула на текущий момент, в центах
  • remainingCents number - Оставшийся бюджет пула (limitCents минус usedCents), в центах
  • contractStartDate string | null - Метка времени ISO 8601, обозначающая начало текущего контрактного периода, или null, если даты контракта не заданы
  • contractEndDate string | null - Метка времени ISO 8601, обозначающая конец текущего контрактного периода, или null, если даты контракта не заданы

teams array

Разбивка использования по командам. Сумма всех usedCents равна pool.usedCents. Каждый object содержит:
  • teamId number - Целочисленный ID команды, связанной с организацией
  • usedCents number - Объём использования этой команды за текущий контрактный период, в центах
  • budgetLimitCents number | 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    }  ]}

Получить события использования

POST/organizations/filtered-usage-events

Получение подробных событий использования по командам, связанным с вашей организацией. Это эквивалент эндпоинта команды /teams/filtered-usage-events на уровне всей организации: возвращает ту же структуру события, при этом каждое событие помечено идентификатором команды-владельца teamId.

Тело запроса

organizationId string Обязательно

Публичный идентификатор организации (например, org_abc123). Должен соответствовать организации для организационного API-ключа, используемого при вызове конечной точки.

teamIds number[]

Необязательный набор целочисленных идентификаторов команд для включения. Каждая команда должна принадлежать организации. Если не указан, включаются все команды из пула организации.

startDate number

Дата начала в миллисекундах эпохи (Unix). Граница включена.

endDate number

Дата окончания в миллисекундах эпохи. Эта граница включена.

userId number

Фильтровать по конкретному идентификатору пользователя.

email string

Фильтровать по адресу электронной почты пользователя.

serviceAccountId string

Фильтровать по идентификатору сервисного аккаунта.

page number

Номер страницы (нумерация с 1). По умолчанию: 1

pageSize number

Количество результатов на странице. По умолчанию: 10

Поля ответа

Каждый объект в usageEvents содержит те же поля, что и конечная точка команды, плюс тег команды-владельца:

  • teamId число - Целочисленный идентификатор команды, которой принадлежит это событие
  • timestamp string - Временная метка события в миллисекундах Unix-времени (в виде строки)
  • userEmail строка — Адрес электронной почты пользователя, отправившего запрос
  • serviceAccountId string | undefined - Идентификатор сервисного аккаунта, от имени которого был выполнен запрос. Не указывается для событий, инициированных пользователем.
  • serviceAccountName string | undefined - Отображаемое имя сервисного аккаунта, выполнившего запрос. Отсутствует для событий, инициированных пользователями.
  • model string - модель ИИ, используемая в запросе
  • kind string — категория оплаты (например, Usage-based, Included in Business)
  • maxMode boolean - использовался ли для запроса режим Max
  • requestsCosts число — Стоимость в единицах запроса
  • isTokenBasedCall логическое значение - Тарифицировался ли запрос по использованию токенов
  • isChargeable boolean - Является ли это событие платным
  • isHeadless логическое значение — указывает, был ли запрос выполнен без подключённого клиента (например, фоновыми агентами)
  • tokenUsage object | undefined - Подробности об использовании токенов (если isTokenBasedCall равно true):
    • inputTokens number - Количество израсходованных входных токенов
    • outputTokens number - Количество сгенерированных выходных токенов
    • cacheWriteTokens number - Токены, записанные в кэш
    • cacheReadTokens number - Токены, прочитанные из кэша
    • totalCents number - Общая стоимость использования модели в центах
    • discountPercentOff number | undefined - Применённая скидка в процентах, если есть
  • chargedCents число - Общая сумма, списанная за это событие, в центах. Для запросов к сторонним моделям, подпадающих под ставку токенов Cursor, сюда входят стоимость модели и ставка токенов Cursor.
  • cursorTokenFee number | 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  }}

Получение данных о ежедневном использовании

POST/organizations/daily-usage-data

Получение ежедневных метрик использования для каждого участника всех команд, связанных с вашей организацией. Это организационный аналог конечной точки команды /teams/daily-usage-data, при котором каждая строка помечена идентификатором teamId команды-владельца. Результаты разбиты по страницам по пользователям и возвращают данные для всех участников, имевших членство в запрошенном диапазоне дат; используйте page и pageSize для постраничного просмотра.

Тело запроса

organizationId string Обязательное

Публичный идентификатор организации (например, org_abc123). Должен соответствовать организации для API-ключа организации, используемого для вызова этого эндпоинта.

startDate number

Дата начала в миллисекундах эпохи. По умолчанию — 7 дней назад.

endDate number

Дата окончания в миллисекундах эпохи. По умолчанию — текущее время.

teamIds number[]

Команды, связанные с организацией, по которым необходимо сформировать отчёт. Если не указано, включаются все команды из пула организации. Не более 100 команд в одном запросе.

page number

Номер страницы (нумерация с 1). По умолчанию: 1

pageSize number

Количество пользователей на странице (1–1000). По умолчанию: 1000

userEmail string

Фильтровать по одному или нескольким пользователям по электронной почте. Принимается один адрес электронной почты или список, разделённый запятыми. userEmails принимается как псевдоним.

Поля ответа

Каждый объект в массиве data содержит те же поля, что и endpoint команды ежедневного использования, плюс teamId. Ключевые поля:

  • userId строка — закодированный идентификатор пользователя с префиксом user_ (например, user_abc123)
  • teamId число - ID команды, связанной с организацией, к которой относится эта строка
  • day строка - Дата, за которую приведена эта запись (дата в формате ISO, например, 2024-03-18)
  • date число — Дата в миллисекундах с начала эпохи
  • email string - Адрес электронной почты пользователя
  • isActive логическое — Была ли активность у пользователя в этот день
  • totalLinesAdded число — Общее количество добавленных строк кода
  • totalLinesDeleted число - Общее количество удалённых строк кода
  • acceptedLinesAdded число - Количество строк, предложенных ИИ и принятых пользователем
  • acceptedLinesDeleted число - Количество удалённых строк, предложенных ИИ и принятых пользователем
  • totalApplies число - Общее количество действий по применению ИИ-кода
  • totalAccepts число - Общее количество принятых ИИ-подсказок
  • totalRejects число — Общее количество отклонённых подсказок ИИ
  • totalTabsShown число - Общее количество автодополнений Tab, показанных пользователю
  • totalTabsAccepted число - Общее количество подсказок Tab completion, принятых пользователем
  • composerRequests число — Количество запросов к Composer
  • chatRequests число - Кол��чество выполненных запросов в чате
  • agentRequests число — Количество запросов, выполненных в режиме Agent
  • cmdkUsages число - Количество использований Inline edit через Cmd+K
  • subscriptionIncludedReqs число - Запросы, включённые в тарифный план подписки
  • apiKeyReqs число - Запросы через API-ключ
  • usageBasedReqs число - Запросы с оплатой по факту использования (сверх лимита)
  • bugbotUsages число - количество использований Bugbot
  • mostUsedModel string | null - Наиболее часто используемая ИИ-модель за день
  • applyMostUsedExtension string | null - Наиболее распространённое расширение файла для операций apply
  • tabMostUsedExtension string | null - Наиболее распространённое расширение файла для автодополнений Tab
  • clientVersion string | 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  }}

Получить данные о расходах

POST/organizations/spend

Возвращает расходы по каждому участнику во всех командах, связанных с вашей организацией. Это общеорганизационный аналог endpoint команды /teams/spend, где для каждого участника указан его teamId. В отличие от endpoint команды, расходы указываются за период действия контракта организации (а не по расчётным периодам отдельных команд) с использованием того же определения включённых расходов, что и в /organizations/pooled-usage, поэтому эти знач��ния согласуются с пулом.

Тело запроса

organizationId string Обязательно

Публичный идентификатор организации (например, org_abc123). Должен соответствовать организации, для которой используется API-ключ организации при вызове endpoint.

teamIds number[]

Команды, связанные с организацией, по которым нужно сформировать отчёт. Если параметр не указан, включаются все команды в пуле организации. Не более 100 команд на запрос.

sortBy string

Сортировка по: email, name, spendCents. По умолчанию: email

sortDirection string

Направление сортировки: asc, desc. По умолчанию: asc

page number

Номер страницы (нумерация с 1). По умолчанию: 1

pageSize number

Количество результатов на странице (1-1000). По умолчанию: 100

Поля ответа

Каждый object в teamMemberSpend содержит:

  • userId string - Закодированный идентификатор пользователя с префиксом user_ (например, user_abc123)
  • teamId number - Идентификатор связанной с организацией команды, в которую входит этот участник
  • name string - Отображаемое имя пользователя
  • email string - Адрес электронной почты пользователя
  • role string - Роль в команде (например, member, owner)
  • spendCents number - Включённые расходы пула в центах, отнесённые к этому участнику за период действия контракта организации

Ответ также включает totalMembers (number), totalPages (number) и объект period (startDate, endDate в миллисекундах Unix time), описывающий период действия контракта организации.

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  }}

Model Access

Просматривайте и обновляйте политику доступа к моделям для команд, связанных с организацией. Эти маршруты соответствуют API доступа к моделям команды и применяются к связанным командам.

Используйте список и GET-запросы для отдельных команд, чтобы выявлять расхождения в конфигурации. Приводите конфигурации команд к единому виду с помощью PUT-запросов и переключателей провайдеров и моделей (включая parameters для каждой модели). Конечной точки для копирования на уровне организации или отпечатка политики нет.

Включение модели без настройки параметров оставляет для неё значения каталога по умолчанию. Используйте массовый маршрут для моделей, если значения по умолчанию, такие как Fast, не соответствуют политике вашей организации.

Числовые значения teamId можно получить из таких маршрутов, как GET /organizations/members.

Список конфигураций Model Access

GET/organizations/teams/model-access/configuration

Возвращает конфигурации доступа к моделям для связанных команд. Используйте этот маршрут для выявления расхождений между неограниченными и пользовательскими политиками. Чтобы выявить расхождения во включении и выключении, выполните GET для провайдеров каждой команды и сравните результаты.

Если для связанной команды не включён контроль доступа к моделям, эта строка всё равно возвращает HTTP 200 и содержит errorMessage вместо state / значений по умолчанию. GET-запросы и маршруты записи для этой команды возвращают 403.

Параметры запроса

page number

Номер страницы (нумерация с 1).

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  }}

Получение конфигурации Model Access команды

GET/organizations/teams/:teamId/model-access/configuration

Получает конфигурацию одной связанной команды.

Параметры

teamId number Обязательный

Целочисленный идентификатор команды, связанной с организацией.
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/configuration \  -u YOUR_ORGANIZATION_API_KEY:

Обновить конфигурацию Model Access для команды

PUT/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" }'

Массовое обновление конфигурации Model Access

PUT/organizations/teams/model-access/configuration

Создаёт или обновляет конфигурацию либо возвращает несколько связанных команд в неограниченный режим. Не более 100 teamIds в запросе.

HTTP 200 означает, что пакет обработан, но не гарантирует успешное выполнение каждой записи. Проверьте errorCount и results[].status для каждой записи. Для успешно обработанных команд сохраняется новая конфигурация. Операция идемпотентна для каждой команды, поэтому повторите запрос только для teamId, обработка которых завершилась ошибкой. Ответ с кодом 4xx или 5xx отклоняет весь запрос и не применяет никаких изменений.

Тело запроса

teamIds number[] Обязательно

ID связанных команд для обновления. Не более 100 в запросе.

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}

Получить провайдеров Model Access для команды

GET/organizations/teams/:teamId/model-access/providers

Список провайдеров и моделей для одной связанной команды, включая parameters для каждой модели (та же структура, что и у маршрута providers команды). Возвращает 409, если у команды нет пользовательской политики.

Параметры

teamId number Обязательно

Целочисленный идентификатор команды, связанной с организацией.
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/providers \  -u YOUR_ORGANIZATION_API_KEY:

Обновить провайдера Model Access для команды

PUT/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}'

Обновить модель Model Access для команды

PUT/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 восстанавливает значение по умолчанию из каталога. См. документацию команды Обновить модель Model Access.

Отключить 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"] }    }  }'

Задать уровень усилий рассуждений по умолчанию:

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"      }    }  }'

Массовое обновление провайдера доступа к моделям

PUT/organizations/teams/model-access/providers/:provider

Включает или отключает провайдера для нескольких связанных команд. Не более 100 teamIds в одном запросе.

HTTP 200 означает, что пакет обработан, но не гарантирует успех для каждой строки. Проверьте errorCount и каждый results[].status. Успешно обработанные строки не откатываются. Операция идемпотентна для каждой команды, поэтому повторяйте запрос только для teamId с ошибкой. Ответ 4xx или 5xx отклоняет весь запрос и не вносит изменений.

Параметры

provider string Обязательно

Идентификатор провайдера из каталога (например, openai).

Тело запроса

enabled boolean Обязательно

teamIds number[] Обязательно

Идентификаторы связанных команд для обновления. Не более 100 в одном запросе.
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": "У команды нет политики доступа к моделям. Создайте её с помощью PUT /teams/model-access/configuration или включите доступ к моделям в Team Settings → Models."    }  ],  "successCount": 2,  "errorCount": 1}

В этом примере HTTP-статус по-прежнему 200, поскольку пакет завершён. Для команд 7 и 8 провайдер остаётся отключённым; повторите запрос только для команды 9 после создания её конфигурации.

Массовое обновление Model Access для модели

PUT/organizations/teams/model-access/providers/:provider/models/:model

Включите или отключите модель для нескольких связанных команд, при необходимости указав те же parameters, что и в PUT модели для одной команды. В одном запросе можно указать до 100 teamIds.

HTTP 200 означает, что пакет обработан, но не что все строки обработаны успешно. Проверьте errorCount и каждый results[].status. Успешные строки не откатываются. Операция идемпотентна для каждой команды, поэтому повторяйте запрос только для teamId, завершившихся ошибкой. Ответ 4xx или 5xx отклоняет весь запрос и не применяет изменений.

Параметры

provider string Обязательно

Идентификатор провайдера в каталоге (например, anthropic).

model string Обязательно

Идентификатор модели в каталоге (например, claude-opus-4-6).

Тело запроса

enabled boolean Обязательно

teamIds number[] Обязательно

Идентификаторы связанных команд для обновления. В одном запросе — не более 100.

parameters object

Необязательно. Та же карта, что и в PUT модели для одной команды. 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": "У команды нет политики доступа к моделям. Создайте её с помощью PUT /teams/model-access/configuration или включите доступ к моделям в Team Settings → Модели."    }  ],  "successCount": 2,  "errorCount": 1}

Ошибки

В теле ответа об ошибке используются:

{ "code": "error", "message": "…" }
СтатусКогда
401Неверный ключ или отсутствует models:read / models:* (либо admin:*)
403Контроль доступа к моделям недоступен для этой команды (маршруты для одной команды)
404Команда не связана с организацией (маршруты для одной команды)
409Чтение провайдера или модели либо изменение для одной команды, когда state этой команды имеет значение unrestricted или legacy
400Неизвестный провайдер, модель, идентификатор параметра или значение параметра; недопустимое тело запроса; пустой allowedValues; значение по умолчанию вне allowedValues; настройки, для которых не определяется допустимый вариант модели; либо будет заблокирована обязательная модель Smart Auto

Массовые маршруты организации (PUT .../providers/:provider, PUT .../providers/:provider/models/:model и PUT .../configuration с teamIds) возвращают HTTP 200 после обработки пакета, даже если некоторые строки завершились ошибкой. Ненулевое значение errorCount по-прежнему означает успешный HTTP-ответ. Несвязанные команды и публичные ошибки, например отсутствие конфигурации, отображаются как строки status: "error". Успешные строки не откатываются. Операции идемпотентны для каждой команды, поэтому повторите попытку только для teamId, для которых произошла ошибка. Любой ответ 4xx или 5xx означает, что весь запрос был отклонён и изменения не были применены. Маршрут списка также возвращает HTTP 200 со строкой errorMessage, когда связанная команда не может загрузить конфигурацию.

Группы организации

Группы организации позволяют упорядочивать участников из команд, связанных с одной и той же организацией. Информацию о настройке дашборда и элементах управления на уровне группы см. в разделе Группы организации.

Список групп организации

GET/organizations/groups

Возвращает группы организации, связанной с вашим API-ключом.

Параметры запроса

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  }}

Получить группу организации

GET/organizations/groups/:groupId

Возвращает одну группу организации.

Параметры

groupId string Обязательный

идентификатор группы организации с префиксом g_.
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"  }}

Список участников группы организации

GET/organizations/groups/:groupId/members

Возвращает участников группы организации.

Параметры

groupId string Обязательно

Идентификатор группы организации с префиксом g_.

Параметры запроса

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  }}

Добавление участников в группу организации

POST/organizations/groups/:groupId/members/bulk-add

Добавляет участников в группу организации.

Параметры

groupId string Обязательно

Идентификатор группы организации с префиксом g_.

Тело запроса

userIds string[] Обязательно

Массив публичных идентификаторов пользователей с префиксом user_. Один запрос может включать до 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}

Удаление участников из группы организации

POST/organizations/groups/:groupId/members/bulk-remove

Удаляет участников из группы организации.

Параметры

groupId string Обязательно

Идентификатор группы организации с префиксом g_.

Тело запроса

userIds string[] Обязательно

Массив публичных идентификаторов пользователей с префиксом user_. Один запрос может включать до 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}