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 } ] }'Участники
Просмотр участников организации и их перемещение между командами, связанными с вашей организацией.
- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация). Для просмотра участников поддерживается область
members:readтолько для чтения; для перемещения участников требуетсяmembers:*. Ключи с областьюadmin:*подходят для обоих случаев. - Область действия:
GET /organizations/membersработает на уровне организации, поддерживает пагинацию и в одном ответе возвращает роль каждого участника в организации, а также его назначения во всех связанных командах. - Пагинация:
GET /organizations/membersподдерживаетpageиpageSize. ЗначениеpageSizeограничено 200; если указать больше, оно будет приведено к 200.
Список участников организации
/organizations/membersВозвращает участников организации, связанной с вашим API-ключом, а также роль каждого участника в организации и его назначения в связанных командах. Результаты поддерживают пагинацию.
Параметры запроса
page number
pageSize number
teamId number
Поля ответа
members array
idnumber - Числовой ID пользователя-участника, совпадающий сid, возвращаемым конечной точкой командыGET /teams/membersemailstring - Адрес электронной почты участникаnamestring - Отображаемое имя участникаorganizationRolestring - Роль на уровне организации:adminилиmember. Она отличается отteamRoleв назначениях команд: пользователь может бытьadminв организации, но иметь рольmemberв конкретной команде, и наоборот.teamsarray - Назначения участника в командах, связанных с организацией. Каждый object содержит:teamIdnumber - Целочисленный ID связанной команды, в которую входит участникteamRolestring - Роль в этой команде (например,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 }}Синхронизация участников команд организации
/organizations/team-memberships/syncЗадайте команды, к которым принадлежат один или несколько пользователей в вашей организации. Это соответствует массовому формату API импорта CSV: вы отправляете массив пользователей и получаете строку результата для каждого из них.
Каждая запись должна содержать ровно одно из полей teamIds или destinationTeamId:
teamIds— это полный набор идентификаторов команд, в которые должен входить пользователь. Эндпоинт приводит участие пользователя в командах в точное соответствие с этим набором. Он добавляет пользователя во все перечисленные команды, в которых его еще нет, и удаляет его из всех команд, не указанных в списке. Чтобы во время миграции оставить пользователя в текущей команде и одновременно добавить в другую, укажите обе (например,[oldTeamId, newTeamId]).destinationTeamIdпомещает пользователя в одну команду. Пользователь добавляется в указанную команду и удаляется из всех остальных. ЗаданиеdestinationTeamId: NNNфункционально эквивалентноteamIds: [NNN].
Тело запроса
organizationId string Обязательно
org_abc123). Должен соответствовать организации для API-ключа Organization, используемого при вызове эндпоинта.users array Обязательно
teamIds или destinationTeamId):userIdnumber | string: ID пользователя, которого нужно синхронизировать. Принимает либо целочисленный ID (например,12345), либо строковый идентификатор (например,"user_abc123").teamIdsnumber[]: Полный набор идентификаторов связанных с организацией команд, в которые пользователь должен входить после синхронизации. Состав команд приводится в точное соответствие с этим набором. Любая команда, не указанная в списке, будет удалена. Чтобы сохранить текущие команды пользователя, включите их в список (например,[7, 8]). Не более 100 команд на запись.destinationTeamIdnumber: Поле для синхронизации с одной командой. Параметр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".- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация). Ключ должен включать область действия
members:*для этого маршрута; ключи сadmin:*тоже подходят, посколькуadminподразумеваетmembers. - Соответствие организации:
organizationIdв теле запроса должен относиться к той же организации, что и API-ключ; в противном случае запрос будет отклонён. - Набор команд:
teamIds— это точный набор команд, в которых должен состоять пользователь после вызова. Пользователь будет удалён из всех команд, НЕ указанных в списке, поэтому, чтобы сохранить их, включите в набор существующие команды пользователя. - Одно поле команды на запись: Для каждой записи укажите ровно одно из полей:
teamIdsилиdestinationTeamId. - Лимит команд на запись:
teamIdsв одной записи может содержать не более 100 команд. - Для успешной синхронизации целевой пользователь уже должен быть участником организации.
- Для успешной синхронизации каждая команда в записи должна быть связана с организацией.
- Если одна запись в
usersзавершится с ошибкой, остальные всё равно могут выполниться успешно; проверьтеstatusиerrorMessageв каждой записиresults. - Размер пакета: Один запрос может включать до 500 записей. При необходимости отправляйте дополнительные пакеты отдельными запросами.
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 команды.
- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация). Ключ должен включать область действия
usage:*для этих маршрутов; ключи сadmin:*тоже подходят, посколькуadminвключаетusage. - Соответствие организации:
organizationIdв теле запроса должен указывать ту же организацию, что и API-ключ; иначе запрос будет отклонен. - Принадлежность команды: каждая запись в
teamIdsдолжна принадлежать организации. Запросы, ссылающиеся на команду вне организации, отклоняются. - Опрос: данные об использовании агрегируются почасово. Опрос этих конечных точек выполняйте не чаще одного раза в час. Ограничение частоты запросов — 20 запросов в минуту. См. ограничения частоты запросов и рекомендации по лучшим практикам.
Получить данные о пуле использования
/organizations/pooled-usageПолучить данные о пуле использования организации: лимит расходов пула, общее использование по организации и разбивку по командам. Эти данные используются в разделе пула использования на дашборде. Все денежные поля указаны в центах.
Тело запроса
organizationId string Обязательно
org_abc123). Должен совпадать с организацией, для которой используется API-ключ организации при вызове эндпоинта.Поля ответа
pool object
limitCentsnumber - Лимит расходов пула для организации в центахusedCentsnumber - Общий объём использования из пула на текущий момент, в центахremainingCentsnumber - Оставшийся бюджет пула (limitCentsминусusedCents), в центахcontractStartDatestring | null - Метка времени ISO 8601, обозначающая начало текущего контрактного периода, илиnull, если даты контракта не заданыcontractEndDatestring | null - Метка времени ISO 8601, обозначающая конец текущего контрактного периода, илиnull, если даты контракта не заданы
teams array
usedCents равна pool.usedCents. Каждый object содержит:teamIdnumber - Целочисленный ID команды, связанной с организациейusedCentsnumber - Объём использования этой команды за текущий контрактный период, в центахbudgetLimitCentsnumber | undefined - Лимит бюджета команды в центах. Присутствует только если для команды настроен бюджет.
curl -X POST https://api.cursor.com/organizations/pooled-usage \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123" }'Ответ:
{ "pool": { "limitCents": 5000000, "usedCents": 1862340, "remainingCents": 3137660, "contractStartDate": "2026-01-01T00:00:00.000Z", "contractEndDate": "2026-12-31T23:59:59.999Z" }, "teams": [ { "teamId": 7, "usedCents": 1440100, "budgetLimitCents": 2000000 }, { "teamId": 8, "usedCents": 422240 } ]}Получить события использования
/organizations/filtered-usage-eventsПолучение подробных событий использования по командам, связанным с вашей организацией. Это эквивалент эндпоинта команды /teams/filtered-usage-events на уровне всей организации: возвращает ту же структуру события, при этом каждое событие помечено идентификатором команды-владельца teamId.
По умолчанию возвращаются события всех команд из пула организации. Передайте teamIds, чтобы ограничить ответ событиями конкретных команд.
Расчет стоимости: Суммируйте значения поля chargedCents по всем событиям, чтобы сопоставить затраты на уровне событий с разбивкой usedCents по командам из /organizations/pooled-usage. Это поле включает как стоимость модели, так и ставку токенов Cursor, если запрос подпадает под эту ставку.
Поле cursorTokenFee обозначает ставку токенов Cursor и присутствует только тогда, когда эта ставка применяется к запросу к сторонней модели. Сюда относятся случаи, когда Auto направляет запрос к сторонней модели. Собственные модели Cursor, такие как Grok и Composer, а также корпоративные аккаунты с оплатой по запросам не включают эту плату. См. Ставка токенов Cursor.
Тело запроса
organizationId string Обязательно
org_abc123). Должен соответствовать организации для организационного API-ключа, используемого при вызове конечной точки.teamIds number[]
startDate number
endDate number
userId number
email string
serviceAccountId string
page number
1pageSize number
10Поля ответа
Каждый объект в usageEvents содержит те же поля, что и конечная точка команды, плюс тег команды-владельца:
teamIdчисло - Целочисленный идентификатор команды, которой принадлежит это событиеtimestampstring - Временная метка события в миллисекундах Unix-времени (в виде строки)userEmailстрока — Адрес электронной почты пользователя, отправившего запросserviceAccountIdstring | undefined - Идентификатор сервисного аккаунта, от имени которого был выполнен запрос. Не указывается для событий, инициированных пользователем.serviceAccountNamestring | undefined - Отображаемое имя сервисного аккаунта, выполнившего запрос. Отсутствует для событий, инициированных пользователями.modelstring - модель ИИ, используемая в запросеkindstring — категория оплаты (например,Usage-based,Included in Business)maxModeboolean - использовался ли для запроса режим MaxrequestsCostsчисло — Стоимость в единицах запросаisTokenBasedCallлогическое значение - Тарифицировался ли запрос по использованию токеновisChargeableboolean - Является ли это событие платнымisHeadlessлогическое значение — указывает, был ли запрос выполнен без подключённого клиента (например, фоновыми агентами)tokenUsageobject | undefined - Подробности об использовании токенов (еслиisTokenBasedCallравноtrue):inputTokensnumber - Количество израсходованных входных токеновoutputTokensnumber - Количество сгенерированных выходных токеновcacheWriteTokensnumber - Токены, записанные в кэшcacheReadTokensnumber - Токены, прочитанные из кэшаtotalCentsnumber - Общая стоимость использования модели в центахdiscountPercentOffnumber | undefined - Применённая скидка в процентах, если есть
chargedCentsчисло - Общая сумма, списанная за это событие, в центах. Для запросов к сторонним моделям, подпадающих под ставку токенов Cursor, сюда входят стоимость модели и ставка токенов Cursor.cursorTokenFeenumber | undefined - Ставка токенов Cursor в центах. Присутствует только, если эта ставка применяется к запросу к сторонней модели (в том числе когда Auto направляет запрос к сторонней модели).
# События всех команд в пуле организацииcurl -X POST https://api.cursor.com/organizations/filtered-usage-events \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "startDate": 1748411762359, "endDate": 1751003762359, "page": 1, "pageSize": 25 }'# События, ограниченные конкретными командамиcurl -X POST https://api.cursor.com/organizations/filtered-usage-events \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "teamIds": [7, 8], "startDate": 1748411762359, "endDate": 1751003762359, "page": 1, "pageSize": 25 }'Ответ:
{ "totalUsageEventsCount": 113, "pagination": { "numPages": 12, "currentPage": 1, "pageSize": 10, "hasNextPage": true, "hasPreviousPage": false }, "usageEvents": [ { "teamId": 7, "timestamp": "1750979225854", "userEmail": "developer@company.com", "model": "claude-4.5-sonnet", "kind": "Usage-based", "maxMode": true, "requestsCosts": 5, "isTokenBasedCall": true, "isChargeable": true, "isHeadless": false, "tokenUsage": { "inputTokens": 126, "outputTokens": 450, "cacheWriteTokens": 6112, "cacheReadTokens": 11964, "totalCents": 20.18232 }, "chargedCents": 21.36232, "cursorTokenFee": 1.18 }, { "teamId": 8, "timestamp": "1750978339901", "userEmail": "admin@company.com", "model": "claude-4-sonnet-thinking", "kind": "Included in Business", "maxMode": true, "requestsCosts": 1.4, "isTokenBasedCall": false, "isChargeable": false, "isHeadless": false, "chargedCents": 8 } ], "period": { "startDate": 1748411762359, "endDate": 1751003762359 }}Получение данных о ежедневном использовании
/organizations/daily-usage-dataПолучение ежедневных метрик использования для каждого участника всех команд, связанных с вашей организацией. Это организационный аналог конечной точки команды /teams/daily-usage-data, при котором каждая строка помечена идентификатором teamId команды-владельца. Результаты разбиты по страницам по пользователям и возвращают данные для всех участников, имевших членство в запрошенном диапазоне дат; используйте page и pageSize для постраничного просмотра.
Тело запроса
organizationId string Обязательное
org_abc123). Должен соответствовать организации для API-ключа организации, используемого для вызова этого эндпоинта.startDate number
endDate number
teamIds number[]
page number
1pageSize number
1000userEmail string
userEmails принимается как псевдоним.Диапазон дат не должен превышать 30 дней. Для более длительных периодов отправьте несколько запросов.
Поля subscriptionIncludedReqs, usageBasedReqs и apiKeyReqs учитывают необработанные события использования, а не тарифицируемые единицы запросов в прежней модели тарификации на основе запросов.
Поля ответа
Каждый объект в массиве data содержит те же поля, что и endpoint команды ежедневного использования, плюс teamId. Ключевые поля:
userIdстрока — закодированный идентификатор пользователя с префиксомuser_(например,user_abc123)teamIdчисло - ID команды, связанной с организацией, к которой относится эта строкаdayстрока - Дата, за которую приведена эта запись (дата в формате ISO, например,2024-03-18)dateчисло — Дата в миллисекундах с начала эпохиemailstring - Адрес электронной почты пользователяisActiveлогическое — Была ли активность у пользователя в этот деньtotalLinesAddedчисло — Общее количество добавленных строк кодаtotalLinesDeletedчисло - Общее количество удалённых строк кодаacceptedLinesAddedчисло - Количество строк, предложенных ИИ и принятых пользователемacceptedLinesDeletedчисло - Количество удалённых строк, предложенных ИИ и принятых пользователемtotalAppliesчисло - Общее количество действий по применению ИИ-кодаtotalAcceptsчисло - Общее количество принятых ИИ-подсказокtotalRejectsчисло — Общее количество отклонённых подсказок ИИtotalTabsShownчисло - Общее количество автодополнений Tab, показанных пользователюtotalTabsAcceptedчисло - Общее количество подсказок Tab completion, принятых пользователемcomposerRequestsчисло — Количество запросов к ComposerchatRequestsчисло - Количество выполненных запросов в чатеagentRequestsчисло — Количество запросов, выполненных в режиме AgentcmdkUsagesчисло - Количество использований Inline edit через Cmd+KsubscriptionIncludedReqsчисло - Запросы, включённые в тарифный план подпискиapiKeyReqsчисло - Запросы через API-ключusageBasedReqsчисло - Запросы с оплатой по факту использования (сверх лимита)bugbotUsagesчисло - количество использований BugbotmostUsedModelstring | null - Наиболее часто используемая ИИ-модель за деньapplyMostUsedExtensionstring | null - Наиболее распространённое расширение файла для операций applytabMostUsedExtensionstring | null - Наиболее распространённое расширение файла для автодополнений TabclientVersionstring | null - используемая версия клиента Cursor
Ответ также включает объект pagination (page, pageSize, totalUsers, totalPages, hasNextPage, hasPreviousPage) и объект period (startDate, endDate).
curl -X POST https://api.cursor.com/organizations/daily-usage-data \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "startDate": 1710720000000, "endDate": 1710892800000, "page": 1, "pageSize": 1000 }'Ответ:
{ "data": [ { "userId": "user_abc123", "teamId": 101, "day": "2024-03-18", "date": 1710720000000, "isActive": true, "totalLinesAdded": 1543, "totalLinesDeleted": 892, "acceptedLinesAdded": 1102, "acceptedLinesDeleted": 645, "totalApplies": 87, "totalAccepts": 73, "totalRejects": 14, "totalTabsShown": 342, "totalTabsAccepted": 289, "composerRequests": 45, "chatRequests": 128, "agentRequests": 12, "cmdkUsages": 67, "subscriptionIncludedReqs": 180, "apiKeyReqs": 0, "usageBasedReqs": 5, "bugbotUsages": 3, "mostUsedModel": "gpt-5", "applyMostUsedExtension": ".tsx", "tabMostUsedExtension": ".ts", "clientVersion": "0.25.1", "email": "developer@company.com" } ], "period": { "startDate": 1710720000000, "endDate": 1710892800000 }, "pagination": { "page": 1, "pageSize": 1000, "totalUsers": 150, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Получить данные о расходах
/organizations/spendВозвращает расходы по каждому участнику во всех командах, связанных с вашей организацией. Это общеорганизационный аналог endpoint команды /teams/spend, где для каждого участника указан его teamId. В отличие от endpoint команды, расходы указываются за период действия контракта организации (а не по расчётным периодам отдельных команд) с использованием того же определения включённых расходов, что и в /organizations/pooled-usage, поэтому эти значения согласуются с пулом.
Тело запроса
organizationId string Обязательно
org_abc123). Должен соответствовать организации, для которой используется API-ключ организации при вызове endpoint.teamIds number[]
sortBy string
email, name, spendCents. По умолчанию: emailsortDirection string
asc, desc. По умолчанию: ascpage number
1pageSize number
100Расходы указываются по командам организации, объединённым в пул, поэтому поля уровня отдельной команды subscriptionCycleStart, overallSpendCents, fastPremiumRequests, hardLimitOverrideDollars и monthlyLimitDollars из /teams/spend не включаются. Период отчётности возвращается в period.
Поля ответа
Каждый object в teamMemberSpend содержит:
userIdstring - Закодированный идентификатор пользователя с префиксомuser_(например,user_abc123)teamIdnumber - Идентификатор связанной с организацией команды, в которую входит этот участникnamestring - Отображаемое имя пользователяemailstring - Адрес электронной почты пользователяrolestring - Роль в команде (например,member,owner)spendCentsnumber - Включённые расходы пула в центах, отнесённые к этому участнику за период действия контракта организации
Ответ также включает 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
Маршруты Model Access находятся в предварительной версии и могут измениться. Пути, поля ответа и поведение при ошибках могут измениться до общего выпуска.
Просматривайте и обновляйте политику доступа к моделям для команд, связанных с организацией. Эти маршруты соответствуют API доступа к моделям команды и применяются к связанным командам.
Используйте список и GET-запросы для отдельных команд, чтобы выявлять расхождения в конфигурации. Приводите конфигурации команд к единому виду с помощью PUT-запросов и переключателей провайдеров и моделей (включая parameters для каждой модели). Конечной точки для копирования на уровне организации или отпечатка политики нет.
Включение модели без настройки параметров оставляет для неё значения каталога по умолчанию. Используйте массовый маршрут для моделей, если значения по умолчанию, такие как Fast, не соответствуют политике вашей организации.
Числовые значения teamId можно получить из таких маршрутов, как GET /organizations/members.
- Доступность: организации Enterprise. Для целевых команд должен быть включён контроль доступа к моделям.
- Аутентификация: API-ключ организации (базовая аутентификация). Для чтения требуется
models:read. Для записи требуетсяmodels:*. Ключи сadmin:*подходят для обоих случаев. Ключиmembers:*,usage:*иread:*не могут вызывать эти маршруты. - Принадлежность команды: каждый
teamIdдолжен быть связан с организацией. В маршрутах для одной команды неизвестные или несвязанные команды возвращают 404. В массовых маршрутах несвязанные команды возвращаются как строки с ошибкой HTTP 200. - Сначала конфигурация: операции чтения и записи для провайдеров и моделей возвращают 409, пока для этой команды действует режим
unrestricted(илиlegacy). Сначала создайте пользовательскую политику с помощьюPUT /organizations/teams/{teamId}/model-access/configuration(или массового маршрута конфигурации). Первый PUT со значениями по умолчанию задаёт значения каталога по умолчанию; он не копирует настройки включения и выключения другой команды. - Возврат к unrestricted: отправьте
{ "state": "unrestricted" }в PUT-запросе конфигурации для отдельной команды или массовом. - Частичный успех массовой операции: массовые маршруты принимают до 100
teamIdsи всегда возвращают HTTP 200, когда пакет обработан, даже если некоторые строки завершились ошибкой. ПроверяйтеerrorCountи каждыйresults[].status. Успешные строки не откатываются. Операции идемпотентны для каждой команды, поэтому повторяйте запрос только для завершившихся ошибкойteamId. Ответ 4xx или 5xx отклоняет весь запрос и не применяет никаких изменений. Структура ответа соответствует/organizations/team-memberships/sync. - Ограничения частоты запросов: 20 запросов в минуту. Операции записи отображаются в журналах аудита команды как события
team_settings. См. ограничения частоты запросов и рекомендации.
Список конфигураций Model Access
/organizations/teams/model-access/configurationВозвращает конфигурации доступа к моделям для связанных команд. Используйте этот маршрут для выявления расхождений между неограниченными и пользовательскими политиками. Чтобы выявить расхождения во включении и выключении, выполните GET для провайдеров каждой команды и сравните результаты.
Если для связанной команды не включён контроль доступа к моделям, эта строка всё равно возвращает HTTP 200 и содержит errorMessage вместо state / значений по умолчанию. GET-запросы и маршруты записи для этой команды возвращают 403.
Параметры запроса
page number
pageSize number
teamIds string
7,8,9.curl -X GET "https://api.cursor.com/organizations/teams/model-access/configuration?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Ответ:
{ "teams": [ { "teamId": 7, "teamName": "Platform", "state": "custom", "newProviderDefault": "disabled", "newModelDefault": "enabled" }, { "teamId": 8, "teamName": "Mobile", "state": "custom", "newProviderDefault": "disabled", "newModelDefault": "enabled" }, { "teamId": 9, "teamName": "Data", "state": "unrestricted", "newProviderDefault": null, "newModelDefault": null }, { "teamId": 10, "teamName": "Research", "errorMessage": "Model access control is not available for this team" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 4, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Получение конфигурации Model Access команды
/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 для команды
/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
/organizations/teams/model-access/configurationСоздаёт или обновляет конфигурацию либо возвращает несколько связанных команд в неограниченный режим. Не более 100 teamIds в запросе.
HTTP 200 означает, что пакет обработан, но не гарантирует успешное выполнение каждой записи. Проверьте errorCount и results[].status для каждой записи. Для успешно обработанных команд сохраняется новая конфигурация. Операция идемпотентна для каждой команды, поэтому повторите запрос только для teamId, обработка которых завершилась ошибкой. Ответ с кодом 4xx или 5xx отклоняет весь запрос и не применяет никаких изменений.
Тело запроса
teamIds number[] Обязательно
state string
unrestricted, чтобы сбросить политику для каждой команды. Не указывайте при передаче значений по умолчанию.newProviderDefault string
enabled или disabled. Обязательно при создании или обновлении пользовательских политик; не указывайте, если state имеет значение unrestricted.newModelDefault string
enabled или disabled. Обязательно при создании или обновлении пользовательских политик; не указывайте, если state имеет значение unrestricted.Задать значения по умолчанию пользовательской политики для нескольких команд:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "newProviderDefault": "disabled", "newModelDefault": "enabled" }'Вернуть несколько команд в неограниченный режим:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "state": "unrestricted" }'Ответ:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "Team is not linked to this organization" } ], "successCount": 2, "errorCount": 1}Получить провайдеров Model Access для команды
/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 для команды
/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 для команды
/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" } } }'Массовое обновление провайдера доступа к моделям
/organizations/teams/model-access/providers/:providerВключает или отключает провайдера для нескольких связанных команд. Не более 100 teamIds в одном запросе.
HTTP 200 означает, что пакет обработан, но не гарантирует успех для каждой строки. Проверьте errorCount и каждый results[].status. Успешно обработанные строки не откатываются. Операция идемпотентна для каждой команды, поэтому повторяйте запрос только для teamId с ошибкой. Ответ 4xx или 5xx отклоняет весь запрос и не вносит изменений.
Параметры
provider string Обязательно
openai).Тело запроса
enabled boolean Обязательно
teamIds number[] Обязательно
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": false }'Ответ:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "У команды нет политики доступа к моделям. Создайте её с помощью PUT /teams/model-access/configuration или включите доступ к моделям в Team Settings → Models." } ], "successCount": 2, "errorCount": 1}В этом примере HTTP-статус по-прежнему 200, поскольку пакет завершён. Для команд 7 и 8 провайдер остаётся отключённым; повторите запрос только для команды 9 после создания её конфигурации.
Массовое обновление Model Access для модели
/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[] Обязательно
parameters object
allowedValues: null снимает ограничение. defaultValue: null восстанавливает значение по умолчанию из каталога.Отключите Fast для связанных команд:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/anthropic/models/claude-opus-4-6 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": true, "parameters": { "fast": { "allowedValues": ["false"] } } }'Зафиксируйте уровень усилий рассуждения по умолчанию для связанных команд:
curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai/models/gpt-5.4 \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "teamIds": [7, 8, 9], "enabled": true, "parameters": { "reasoning": { "allowedValues": ["low", "medium", "high"], "defaultValue": "high" } } }'Ответ:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "У команды нет политики доступа к моделям. Создайте её с помощью 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_) группы организации.
- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация). Для любого маршрута групп — как на чтение, так и на запись — требуется scope
members:*. Ключи со scopeadmin:*тоже подходят, посколькуadminвключает праваmembers. - Идентификаторы групп: у каждой группы два идентификатора.
id(префиксg_) — идентификатор группы в API организации; используйте его везде, где маршрут принимает:groupId.publicId(префиксgrp_) — публичный идентификатор группы. - Поиск по имени: чтобы найти идентификаторы группы по её имени, вызовите Список групп организации с query-параметром
name. Ни один маршрут не принимает имя вместо:groupId. - Пагинация: маршруты списков принимают
pageиpageSize. Оба значения должны быть положительными целыми числами. - Ограничение частоты запросов: каждый маршрут допускает 20 запросов в минуту на организацию. См. ограничения частоты запросов и рекомендации по лучшим практикам.
- Группы, синхронизированные через SCIM: управляйте составом участников в своём провайдере идентификации. Запросы на добавление и удаление участников для таких групп возвращают
400.
Для маршрутов групп предусмотрены общие ответы с ошибками:
| Статус | Когда |
|---|---|
400 | Некорректный идентификатор группы, значение пагинации или тело запроса |
401 | Неверный API-ключ либо у ключа отсутствует scope members:* (или admin:*) |
404 | Группа не существует в организации |
429 | Превышено ограничение частоты запросов. Ответ содержит заголовок Retry-After: 60 |
Список групп организации
/organizations/groupsВозвращает группы организации, связанной с вашим API-ключом. Передайте name, чтобы найти одну группу по её точному названию.
Параметры запроса
page number
1.pageSize number
50. Максимум — 200; значения больше 200 приводятся к 200.name string
Platform%20Engineering). Названия групп уникальны в пределах организации, поэтому ответ представляет собой обычный список с одной группой или без групп. Если совпадений нет, возвращается 200 с пустым массивом groups, а не 404. Не указывайте name или отправьте его пустым, чтобы получить список всех групп.Поля ответа
Каждый object в groups содержит:
idstring — идентификатор группы организации с префиксомg_publicIdstring — публичный идентификатор группы с префиксомgrp_namestring — название группыmemberCountnumber — количество участников в группеmonthlySpendingLimitDollarsnumber | null — месячный лимит расходов в целых долларах для каждого участника группы.nullозначает, что у группы нет лимита.createdAtstring — время создания в формате ISO 8601updatedAtstring — время последнего обновления в формате 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 }}Получить группу организации
/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" }}Создать группу организации
/organizations/groupsСоздаёт группу организации с составом участников, управляемым вручную. Чтобы создать группу, синхронизированную через SCIM, вместо этого синхронизируйте её из вашего провайдера идентификации в дашборде.
Тело запроса
name string Обязательный
Поля ответа
Возвращает 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" }}Обновление группы организации
/organizations/groups/:groupIdОбновляет название группы или месячный лимит расходов. Обновление частичное: укажите хотя бы одно поле — все не указанные поля сохранят текущие значения.
Параметры
groupId string Обязательный
g_.Тело запроса
name string
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" }}Удаление группы организации
/organizations/groups/:groupIdУдаляет группу организации. Группа должна быть пустой: перед удалением исключите из неё всех участников.
Параметры
groupId string Обязательный
g_.Ответ
Возвращает 204 No Content после удаления группы.
Ошибки
400— в группе ещё остались участники либо для группы настроен активный SCIM-mapping.
Группу с активным SCIM-mapping нельзя удалить через этот endpoint. Удалите mapping в дашборде, исключите всех участников, а затем удалите группу.
curl -X DELETE https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \ -u YOUR_ORGANIZATION_API_KEY:Ответ: 204 No Content
Список участников группы организации
/organizations/groups/:groupId/membersВозвращает участников группы организации.
Параметры
groupId string Обязательный
g_.Параметры запроса
page number
1.pageSize number
50. Максимум — 200; значения выше 200 приводятся к 200.Поля ответа
Каждый object в members содержит:
userIdstring - Публичный идентификатор пользователя с префиксомuser_namestring - Отображаемое имя участникаemailstring - Адрес электронной почты участникаjoinedAtstring - Время добавления участника в группу в формате 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 }}Добавление участников в группу организации
/organizations/groups/:groupId/members/bulk-addДобавляет участников в группу организации с ручным управлением.
Параметры
groupId string Обязательный
g_.Тело запроса
userIds string[] Обязательный
user_. Один запрос может включать до 100 пользователей.Поля ответа
addedCount number
Группы, синхронизированные через SCIM, отклоняют ручные изменения состава с ответом 400.
Управляйте их составом в своём провайдере идентификации.
curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-add \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "userIds": ["user_abc123", "user_def456"] }'Ответ:
{ "addedCount": 2}Удаление участников из группы организации
/organizations/groups/:groupId/members/bulk-removeУдаляет участников из группы организации с ручным управлением.
Параметры
groupId string Обязательный
g_.Тело запроса
userIds string[] Обязательный
user_. Один запрос может включать до 100 пользователей.Поля ответа
removedCount number
Группы, синхронизированные через SCIM, отклоняют ручные изменения состава с ответом 400.
Управляйте их составом в своём провайдере идентификации.
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 перечислены в разделе Соответствие требованиям и мониторинг.
- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация) с областью доступа
auditlogs:read. Также подходят ключи сadmin:*. - Ограничение частоты запросов: 20 запросов в минуту на организацию. См. ограничения частоты запросов.
Получение журналов аудита
/organizations/audit-logsПолучает события лога аудита для организации, к которой прикреплён ваш API-ключ. Передайте teamId, чтобы ограничить выборку одной связанной командой. Параметры запроса, значения по умолчанию и структура ответа такие же, как у конечной точки для команды, с одним дополнением: каждое событие содержит team_id.
Параметры запроса
startTime строка | number
endTime строка | number
eventTypes строка
event_type для фильтрации, через запятую.search строка
user_email, event_type и event_id. Поле event_data в поиске не участвует.users строка
user_ через запятую. Не более 100 значений. Все пользователи должны быть участниками организации.teamId number
403.page number
1pageSize number
100Диапазон дат не может превышать 30 дней. Для более длительных периодов отправьте несколько запросов. События возвращаются от старых к новым.
Поля ответа
events массив
event_idстрока — UUID событияtimestampстрока — метка времени в формате ISO 8601team_idстрока — команда, к которой относится событие. Пусто для событий уровня организации, напримерorganization_groupиxai_credit_transferip_addressстрока — IP-адрес клиента, отправившего запросuser_emailстрока — инициатор действия. ЗначенияApi Key:,Bot:иSystemописаны в разделе Формат логаevent_typeстрока — Тип событияapplication_typeстрока —cursor,grok_botили пустое значение, если тип неизвестенevent_dataobject — поля, относящиеся к конкретному событию.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.
- Доступность: только для Enterprise. Доступ включается отдельно для каждой команды — для этого обратитесь в команду по работе с аккаунтом. До включения все маршруты возвращают для этой команды
403. - Аутентификация: API-ключ организации (базовая аутентификация) с областью доступа
admin:*. Для ключей с любой другой областью доступа возвращается401. Эти маршруты используют API-ключ организации, а не API-ключ команды, так как один компьютер обслуживает все команды, в которых состоит участник. - Команда:
teamIdв пути должен указывать на команду, связанную с вашей организацией. Для любой другой команды возвращается404. - Одна операция на команду: команда может выполнять только одну операцию за раз. При попытке запустить новую операцию, пока выполняется текущая, возвращается
409с ID выполняемой операции. - Ограничение частоты запросов: для запуска операции — не более 20 запросов в минуту на организацию. Для каждого маршрута статуса — не более 120 запросов в минуту на организацию, так что статус можно опрашивать, пока операция выполняется. См. ограничение частоты запросов.
Общие ответы с ошибками для маршрутов операций:
| Статус | Когда |
|---|---|
400 | Некорректное тело или параметры запроса, неизвестное поле в теле, userId, не являющийся текущим участником команды, или слишком много участников |
401 | Недействительный API-ключ или у ключа нет области доступа admin:* |
403 | Операции с компьютерами Grok Bot не включены для команды |
404 | Команда не связана с вашей организацией, либо операция не существует или больше недоступна |
409 | Для команды уже выполняется другая операция (только при запуске) |
429 | Превышено ограничение частоты запросов. Ответ содержит заголовок Retry-After: 60 |
503 | Операции временно недоступны. Повторите тот же запрос |
Запуск операции с компьютерами Grok Bot
/organizations/teams/:teamId/grok-bot/operationsЗапускает пересоздание, завершение или удаление компьютеров участников одной команды. Запрос возвращает 202 Accepted, как только операция поставлена в очередь, после чего Cursor обрабатывает участников пакетами. Чтобы отслеживать ход выполнения, опрашивайте Get Grok Bot Computer Operation.
Параметры
teamId number Обязательный
Тело запроса
action string Обязательный
recreate_vm— создать новый компьютер на последнем образе и выполнить Настройку команды. Боты, файлы и логины переносятся, а бот, не завершивший текущий шаг, приостанавливается и продолжает работу на новом компьютере.terminate_vm— удалить текущий компьютер участника, сохранив долговременный диск. Следующее сообщение участника запустит новый компьютер.delete_vm_and_data— удалить компьютер и его постоянные данные, чтобы участник начал с нуля. Это действие необратимо.
userIds number[] Обязательный
teamId. Передайте от 1 до 25 000 ID (для delete_vm_and_data — не более 1 000). Дубликаты игнорируются. Каждый ID должен принадлежать текущему участнику команды, который уже входил в Cursor; если хотя бы один ID не подходит, запрос возвращает 400 и ничего не запускается. При пересоздании и завершении участники без компьютера пропускаются. delete_vm_and_data в любом случае удаляет постоянные данные.operationId string Обязательный
operationId. Cursor вернёт 202 для уже существующей операции, а не запустит вторую, даже если она ещё выполняется. При повторе Cursor не сравнивает остальное тело запроса, поэтому генерируйте новый UUID для каждой новой операции.Поля ответа
Возвращает 202 Accepted со следующими полями:
operationIdstring — ID операции в нижнем регистре. Используйте его с Get Grok Bot Computer Operation.
Если для команды уже выполняется другая операция, маршрут возвращает 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
/organizations/teams/:teamId/grok-bot/operations/:operationIdПолучить ход выполнения операции: общие счётчики по всем участникам и страницу результатов по каждому участнику. Опрашивайте этот маршрут, пока state не перестанет иметь значение running.
Параметры
teamId number Обязательный
operationId строка Обязательный
Параметры запроса
limit number
100cursor строка
nextCursor из предыдущей страницы. Для первой страницы не указывается.Поля ответа
operationId строка
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
userIdnumber — числовой ID пользователя-участникаstateстрока —queued,running,succeeded,skippedилиfailedreasonstring | null - Причина, по которой участник был пропущен или его обработка завершилась ошибкой. В остальных случаях —null
items имеет значение null — такие операции возвращают только counts.itemsTruncated boolean
true, если в операции более 1000 участников и результаты по отдельным участникам не сохраняются.nextCursor строка | null
cursor, чтобы получить следующую страницу items. На последней странице — null.Чаще всего встречаются следующие значения reason:
reason | state | Значение |
|---|---|---|
no-box | skipped | У участника не было работающего или находящегося в режиме гибернации компьютера. Только для операций «Пересоздать» и «Завершить» |
team-member-not-found | skipped | Участник покинул команду, пока операция находилась в очереди |
member-identity-changed | skipped | Аккаунт участника изменился, пока операция находилась в очереди |
recreate-already-in-progress | failed | Компьютер участника уже пересоздавался. Когда пересоздание завершится, запустите для этого участника новую операцию |
authorization-revoked | failed | API-ключ, которым была запущена операция, был отозван, истёк или утратил права 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
/organizations/teams/:teamId/grok-bot/operations/latestВозвращает выполняющуюся операцию команды, а если такой нет — самую последнюю. Используйте этот метод, чтобы выяснить, что вызывает ошибку 409, или вернуться к операции, если её ID больше не известен. Пока у команды не было ни одной операции, последней операции нет, и маршрут возвращает 404.
Параметры
teamId number Обязательный
Параметры запроса
Принимает те же параметры 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}