Sitelet https://cursor.com/ru/docs/account/organizations/organization-admin-api
Skip to main content

Command Palette

Search for a command to run...

API

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

API организации позволяет выполнять действия, применимые ко всем командам, связанным с организацией, например перемещать пользователей между этими командами, формировать отчеты о пуле использования в командах, управлять группами организации, просматривать или обновлять Model Access, а также управлять компьютерами Grok Bot участников. Для этого используются 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 подразумевает и остальные области действия. Операции с компьютером Grok Bot доступны только с 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, включая массовое переключение поставщиков и моделей и массовую конфигурацию
auditlogs:readДоступ только для чтения к фиду журнала аудита организации.GET /organizations/audit-logs
admin:*Полный доступ ко всем маршрутам организации. Единственная область действия, позволяющая выполнять операции с компьютерами Grok Bot.Всё вышеперечисленное, а также все маршруты /organizations/teams/{teamId}/grok-bot/operations

Выбирайте минимально необходимую область действия для задачи. Используйте 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.

teamId number

Вернуть только участников указанной команды. Если команда не связана с организацией, возвращается пустая страница.

Поля ответа

members array

Массив объектов участников организации, каждый из которых содержит:
  • id number - Числовой ID пользователя-участника, совпадающий с 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": [    {      "id": 12345,      "email": "developer@company.com",      "name": "Alex",      "organizationRole": "member",      "teams": [        { "teamId": 7, "teamRole": "member" },        { "teamId": 8, "teamRole": "owner" }      ]    },    {      "id": 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, когда связанная команда не может загрузить конфигурацию.

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

Группы организации объединяют участников из команд, привязанных к одной организации. О настройке в дашборде и элементах управления на уровне группы см. Группы организации. Группы каталога команды используют Team Admin API по адресу /teams/directory-groups и идентификаторы вида team_group_…. Эти маршруты не принимают значения id (g_) или publicId (grp_) группы организации.

Для маршрутов групп предусмотрены общие ответы с ошибками:

СтатусКогда
400Некорректный идентификатор группы, значение пагинации или тело запроса
401Неверный API-ключ либо у ключа отсутствует scope members:* (или admin:*)
404Группа не существует в организации
429Превышено ограничение частоты запросов. Ответ содержит заголовок Retry-After: 60

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

GET/organizations/groups

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

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

page number

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

pageSize number

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

name string

Точное название одной группы в URL-кодировке (например, Platform%20Engineering). Названия групп уникальны в пределах организации, поэтому ответ представляет собой обычный список с одной группой или без групп. Если совпадений нет, возвращается 200 с пустым массивом groups, а не 404. Не указывайте name или отправьте его пустым, чтобы получить список всех групп.

Поля ответа

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

  • id string — идентификатор группы организации с префиксом g_
  • publicId string — публичный идентификатор группы с префиксом grp_
  • name string — название группы
  • memberCount number — количество участников в группе
  • monthlySpendingLimitDollars number | null — месячный лимит расходов в целых долларах для каждого участника группы. null означает, что у группы нет лимита.
  • createdAt string — время создания в формате ISO 8601
  • updatedAt string — время последнего обновления в формате ISO 8601

pagination object

Метаданные пагинации: page, pageSize, totalCount, totalPages, hasNextPage и hasPreviousPage.
curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \  -u YOUR_ORGANIZATION_API_KEY:

Поиск одной группы по названию:

curl -X GET "https://api.cursor.com/organizations/groups?name=Engineering" \  -u YOUR_ORGANIZATION_API_KEY:

Ответ:

{  "groups": [    {      "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",      "publicId": "grp_01k2ja2000e0080000000000n2",      "name": "Engineering",      "memberCount": 12,      "monthlySpendingLimitDollars": 500,      "createdAt": "2026-01-15T10:30:00.000Z",      "updatedAt": "2026-01-20T14:22:00.000Z"    },    {      "id": "g_kljUvI0ASZORvSEXf9hV0ydcso",      "publicId": "grp_01k2jb4000e0080000000000p7",      "name": "Design",      "memberCount": 8,      "monthlySpendingLimitDollars": null,      "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  }}

Ответ (поиск по названию):

{  "groups": [    {      "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",      "publicId": "grp_01k2ja2000e0080000000000n2",      "name": "Engineering",      "memberCount": 12,      "monthlySpendingLimitDollars": 500,      "createdAt": "2026-01-15T10:30:00.000Z",      "updatedAt": "2026-01-20T14:22:00.000Z"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "totalCount": 1,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  }}

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

GET/organizations/groups/:groupId

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

Параметры

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

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

Поля ответа

Объект group содержит id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt и updatedAt. Эти поля совпадают с полями ответа Список групп организации.

curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY:

Ответ:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Engineering",    "memberCount": 12,    "monthlySpendingLimitDollars": 500,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-20T14:22:00.000Z"  }}

Создать группу организации

POST/organizations/groups

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

Тело запроса

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

Название группы. Должно быть уникальным среди активных групп организации. Cursor удаляет пробелы в начале и в конце.

Поля ответа

Возвращает 201 Created с новым объектом group. Объект содержит id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt и updatedAt.

Ошибки

  • 400 — название группы отсутствует, пустое или уже используется другой активной группой.
curl -X POST https://api.cursor.com/organizations/groups \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "name": "Engineering"  }'

Ответ:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Engineering",    "memberCount": 0,    "monthlySpendingLimitDollars": null,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-15T10:30:00.000Z"  }}

Обновление группы организации

PATCH/organizations/groups/:groupId

Обновляет название группы или месячный лимит расходов. Обновление частичное: укажите хотя бы одно поле — все не указанные поля сохранят текущие значения.

Параметры

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

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

Тело запроса

name string

Новое название группы. Должно быть уникальным среди активных групп организации. Cursor удаляет пробелы в начале и в конце.

monthlySpendingLimitDollars number

Месячный лимит расходов в целых долларах для каждого участника группы, от 0 до 2147483647.

clearMonthlySpendingLimitDollars boolean

Задайте true, чтобы снять лимит расходов группы. Не передавайте monthlySpendingLimitDollars в этом же запросе.

Поля ответа

Возвращает обновлённый объект group с полями id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt и updatedAt.

Ошибки

  • 400 — в запросе нет полей для обновления, указано недопустимое значение, используется название другой активной группы либо лимит расходов одновременно задаётся и снимается.
curl -X PATCH https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "name": "Platform Engineering",    "monthlySpendingLimitDollars": 500  }'

Ответ:

{  "group": {    "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",    "publicId": "grp_01k2ja2000e0080000000000n2",    "name": "Platform Engineering",    "memberCount": 12,    "monthlySpendingLimitDollars": 500,    "createdAt": "2026-01-15T10:30:00.000Z",    "updatedAt": "2026-01-20T14:22:00.000Z"  }}

Удаление группы организации

DELETE/organizations/groups/:groupId

Удаляет группу организации. Группа должна быть пустой: перед удалением исключите из неё всех участников.

Параметры

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

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

Ответ

Возвращает 204 No Content после удаления группы.

Ошибки

  • 400 — в группе ещё остались участники либо для группы настроен активный SCIM-mapping.
curl -X DELETE https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \  -u YOUR_ORGANIZATION_API_KEY:

Ответ: 204 No Content

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

GET/organizations/groups/:groupId/members

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

Параметры

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

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

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

page number

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

pageSize number

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

Поля ответа

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

  • userId string - Публичный идентификатор пользователя с префиксом user_
  • name string - Отображаемое имя участника
  • email string - Адрес электронной почты участника
  • joinedAt string - Время добавления участника в группу в формате ISO 8601

pagination object

Метаданные пагинации: page, pageSize, totalCount, totalPages, hasNextPage и hasPreviousPage.
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 пользователей.

Поля ответа

addedCount number

Количество участников, добавленных этим запросом. Cursor игнорирует пользователей вне организации и тех, кто уже состоит в группе, — они не учитываются в этом значении.
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 пользователей.

Поля ответа

removedCount number

Количество участников, удалённых этим запросом. Cursor игнорирует пользователей, не состоящих в группе, — они не учитываются в этом значении.
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}

Журналы аудита

Фид аудита организации возвращает те же события, что и конечная точка команды GET /teams/audit-logs, по всем командам, связанным с организацией, а также события уровня организации, не привязанные ни к одной команде. Типы событий и поля event_data перечислены в разделе Соответствие требованиям и мониторинг.

Получение журналов аудита

GET/organizations/audit-logs

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

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

startTime строка | number

Время начала (по умолчанию — 7 дней назад). Поддерживает те же форматы дат, что и конечная точка команды.

endTime строка | number

Время окончания (по умолчанию — now).

eventTypes строка

Значения event_type для фильтрации, через запятую.

search строка

Поиск подстроки без учёта регистра по полям user_email, event_type и event_id. Поле event_data в поиске не участвует.

users строка

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

teamId number

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

page number

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

pageSize number

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

Поля ответа

events массив

События аудита; каждое содержит:
  • event_id строка — UUID события
  • timestamp строка — метка времени в формате ISO 8601
  • team_id строка — команда, к которой относится событие. Пусто для событий уровня организации, например organization_group и xai_credit_transfer
  • ip_address строка — IP-адрес клиента, отправившего запрос
  • user_email строка — инициатор действия. Значения Api Key:, Bot: и System описаны в разделе Формат лога
  • event_type строка — Тип события
  • application_type строка — cursor, grok_bot или пустое значение, если тип неизвестен
  • event_data object — поля, относящиеся к конкретному событию. old_value и new_value разбираются как JSON, если хранящееся значение является корректным JSON

pagination object

Метаданные пагинации: page, pageSize, totalCount, totalPages, hasNextPageи hasPreviousPage.

params object

Итоговые параметры запроса, возвращаемые в ответе: organizationId, teamId, startDate, endDate, eventTypes, search и users.
curl -X GET "https://api.cursor.com/organizations/audit-logs?startTime=7d&endTime=now&eventTypes=organization_group,add_user" \  -u YOUR_ORGANIZATION_API_KEY:

Ответ:

{  "events": [    {      "event_id": "c2d4e6f8-1a3b-4c5d-8e9f-0a1b2c3d4e5f",      "timestamp": "2026-09-14T09:02:11.000Z",      "team_id": "",      "ip_address": "203.0.113.42",      "user_email": "admin@company.com",      "event_type": "organization_group",      "application_type": "cursor",      "event_data": {        "action": "create",        "organization_group_id": "grp_7Hq2mKp9vRt4xLw1",        "organization_group_name": "Platform Engineering"      }    },    {      "event_id": "8a1f0f0e-0d1b-4c7e-9b3a-2f6e1c9d4a55",      "timestamp": "2026-09-14T18:30:45.123Z",      "team_id": "12345",      "ip_address": "203.0.113.42",      "user_email": "alice@company.com",      "event_type": "add_user",      "application_type": "cursor",      "event_data": {        "user_email": "bob@company.com",        "role": "member",        "source": "domain_join",        "team_id": "12345",        "invited_by_email": "",        "invited_by_user_id": "0",        "invite_id": ""      }    }  ],  "pagination": {    "page": 1,    "pageSize": 100,    "totalCount": 2,    "totalPages": 1,    "hasNextPage": false,    "hasPreviousPage": false  },  "params": {    "organizationId": "org_abc123",    "startDate": 1757232131000,    "endDate": 1757836931000,    "eventTypes": "organization_group,add_user"  }}

Компьютеры Grok Bot

Пересоздавайте, завершайте или удаляйте облачные компьютеры, на которых работает Grok Bot для участников команды, а затем отслеживайте операцию, пока не будет получен результат для каждого участника. Эти маршруты выполняют те же операции, что и раздел Grok Bot Computers в дашборде. О том, как каждое действие влияет на компьютер участника и что при этом видит участник, см. в разделе Управление компьютерами Grok Bot.

Общие ответы с ошибками для маршрутов операций:

СтатусКогда
400Некорректное тело или параметры запроса, неизвестное поле в теле, userId, не являющийся текущим участником команды, или слишком много участников
401Недействительный API-ключ или у ключа нет области доступа admin:*
403Операции с компьютерами Grok Bot не включены для команды
404Команда не связана с вашей организацией, либо операция не существует или больше недоступна
409Для команды уже выполняется другая операция (только при запуске)
429Превышено ограничение частоты запросов. Ответ содержит заголовок Retry-After: 60
503Операции временно недоступны. Повторите тот же запрос

Запуск операции с компьютерами Grok Bot

POST/organizations/teams/:teamId/grok-bot/operations

Запускает пересоздание, завершение или удаление компьютеров участников одной команды. Запрос возвращает 202 Accepted, как только операция поставлена в очередь, после чего Cursor обрабатывает участников пакетами. Чтобы отслеживать ход выполнения, опрашивайте Get Grok Bot Computer Operation.

Параметры

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

Целочисленный ID команды, связанной с организацией.

Тело запроса

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

Действие с компьютером каждого участника:
  • recreate_vm — создать новый компьютер на последнем образе и выполнить Настройку команды. Боты, файлы и логины переносятся, а бот, не завершивший текущий шаг, приостанавливается и продолжает работу на новом компьютере.
  • terminate_vm — удалить текущий компьютер участника, сохранив долговременный диск. Следующее сообщение участника запустит новый компьютер.
  • delete_vm_and_data — удалить компьютер и его постоянные данные, чтобы участник начал с нуля. Это действие необратимо.

userIds number[] Обязательный

Числовые ID пользователей — участников, к которым применяется действие. Чтобы получить их, вызовите List Organization Members с teamId. Передайте от 1 до 25 000 ID (для delete_vm_and_data — не более 1 000). Дубликаты игнорируются. Каждый ID должен принадлежать текущему участнику команды, который уже входил в Cursor; если хотя бы один ID не подходит, запрос возвращает 400 и ничего не запускается. При пересоздании и завершении участники без компьютера пропускаются. delete_vm_and_data в любом случае удаляет постоянные данные.

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

UUID, который вы генерируете для этой операции. Если запрос завершился по тайм-ауту или с ошибкой, отправьте его повторно с тем же operationId. Cursor вернёт 202 для уже существующей операции, а не запустит вторую, даже если она ещё выполняется. При повторе Cursor не сравнивает остальное тело запроса, поэтому генерируйте новый UUID для каждой новой операции.

Поля ответа

Возвращает 202 Accepted со следующими полями:

Если для команды уже выполняется другая операция, маршрут возвращает 409 с code: "conflict", message и runningOperationId — ID выполняющейся операции. runningOperationId равен null, если Cursor не может её определить; в этом случае вызовите Get Latest Grok Bot Computer Operation.

curl -X POST https://api.cursor.com/organizations/teams/7/grok-bot/operations \  -u YOUR_ORGANIZATION_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "action": "recreate_vm",    "userIds": [12345, 12346, 12347],    "operationId": "3f2a9c1e-8b4d-4e6f-a1c2-5d7e9f0b1a2c"  }'

Ответ:

{  "operationId": "3f2a9c1e-8b4d-4e6f-a1c2-5d7e9f0b1a2c"}

Ответы с ошибками:

409: для команды уже выполняется другая операция:

{  "code": "conflict",  "message": "Another Grok Bot computer operation is already running for this team. Wait for it to finish, then try again.",  "runningOperationId": "b81c4e27-6a90-4f3d-9e15-2c8d7a4f6b03"}

400: пользователь не входит в состав команды:

{  "code": "error",  "message": "Every userId must be a current member of the team."}

403: операции не включены для команды:

{  "code": "error",  "message": "Bot fleet admin API access is not enabled for this team"}

Получение операции компьютера Grok Bot

GET/organizations/teams/:teamId/grok-bot/operations/:operationId

Получить ход выполнения операции: общие счётчики по всем участникам и страницу результатов по каждому участнику. Опрашивайте этот маршрут, пока state не перестанет иметь значение running.

Параметры

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

Целочисленный ID команды, привязанной к организации.

operationId строка Обязательный

UUID, переданный в Start Grok Bot Computer Operation.

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

limit number

Число результатов на странице для каждого участника (1–1000). По умолчанию: 100

cursor строка

Значение nextCursor из предыдущей страницы. Для первой страницы не указывается.

Поля ответа

operationId строка

ID операции.

action строка

recreate_vm, terminate_vm или delete_vm_and_data.

state строка

running — пока у каждого участника не появится результат. Завершённая операция получает статус succeeded, если ни у одного участника не произошло ошибки, partially_succeeded — если у части участников произошла ошибка, а остальные завершились успешно или были пропущены, и failed — если ошибка произошла у всех участников.

counts object

Число участников по всей операции: total, queued, running, succeeded, skipped и failed. noVmSkipped — доля skipped, приходящаяся на участников без компьютера. Для delete_vm_and_data это значение всегда равно 0: это действие удаляет постоянные данные независимо от того, запущен ли компьютер.

items массив | null

Результаты по каждому участнику на этой странице. Каждый результат содержит:
  • userId number — числовой ID пользователя-участника
  • state строка — queued, running, succeeded, skipped или failed
  • reason string | null - Причина, по которой участник был пропущен или его обработка завершилась ошибкой. В остальных случаях — null
Для операций с более чем 1 000 участников items имеет значение null — такие операции возвращают только counts.

itemsTruncated boolean

true, если в операции более 1000 участников и результаты по отдельным участникам не сохраняются.

nextCursor строка | null

Передайте это значение в cursor, чтобы получить следующую страницу items. На последней странице — null.

Чаще всего встречаются следующие значения reason:

reasonstateЗначение
no-boxskippedУ участника не было работающего или находящегося в режиме гибернации компьютера. Только для операций «Пересоздать» и «Завершить»
team-member-not-foundskippedУчастник покинул команду, пока операция находилась в очереди
member-identity-changedskippedАккаунт участника изменился, пока операция находилась в очереди
recreate-already-in-progressfailedКомпьютер участника уже пересоздавался. Когда пересоздание завершится, запустите для этого участника новую операцию
authorization-revokedfailedAPI-ключ, которым была запущена операция, был отозван, истёк или утратил права admin:* до того, как Cursor добрался до этого участника

Любое другое значение reason у участника со статусом failed означает, что действие не было завершено. Для таких участников запустите новую операцию. Дальнейшие шаги описаны в разделе Пропущенные и неудавшиеся участники.

Ответ 404 с сообщением Operation not found. означает, что операция так и не была запущена или срок её хранения истёк. Ответ 404 с сообщением This operation finished, and its status is no longer available. означает, что операция завершена, но Cursor больше не хранит её результаты.

curl -X GET "https://api.cursor.com/organizations/teams/7/grok-bot/operations/3f2a9c1e-8b4d-4e6f-a1c2-5d7e9f0b1a2c?limit=100" \  -u YOUR_ORGANIZATION_API_KEY:

Ответ:

{  "operationId": "3f2a9c1e-8b4d-4e6f-a1c2-5d7e9f0b1a2c",  "action": "recreate_vm",  "state": "partially_succeeded",  "counts": {    "total": 3,    "queued": 0,    "running": 0,    "succeeded": 1,    "skipped": 1,    "failed": 1,    "noVmSkipped": 1  },  "items": [    { "userId": 12345, "state": "succeeded", "reason": null },    { "userId": 12346, "state": "skipped", "reason": "no-box" },    { "userId": 12347, "state": "failed", "reason": "recreate-already-in-progress" }  ],  "itemsTruncated": false,  "nextCursor": null}

Получить последнюю операцию компьютера Grok Bot

GET/organizations/teams/:teamId/grok-bot/operations/latest

Возвращает выполняющуюся операцию команды, а если такой нет — самую последнюю. Используйте этот метод, чтобы выяснить, что вызывает ошибку 409, или вернуться к операции, если её ID больше не известен. Пока у команды не было ни одной операции, последней операции нет, и маршрут возвращает 404.

Параметры

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

Целочисленный ID команды, связанной с организацией.

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

Принимает те же параметры limit и cursor, что и Получить операцию компьютера Grok Bot.

Поля ответа

Те же поля, что и в Получить операцию компьютера Grok Bot.

curl -X GET https://api.cursor.com/organizations/teams/7/grok-bot/operations/latest \  -u YOUR_ORGANIZATION_API_KEY:

Ответ:

{  "operationId": "b81c4e27-6a90-4f3d-9e15-2c8d7a4f6b03",  "action": "terminate_vm",  "state": "running",  "counts": {    "total": 2400,    "queued": 2340,    "running": 20,    "succeeded": 38,    "skipped": 2,    "failed": 0,    "noVmSkipped": 2  },  "items": null,  "itemsTruncated": true,  "nextCursor": null}