API организации
API организации позволяет выполнять действия, применимые ко всем командам, связанным с организацией, например перемещать пользователей между этими командами, формировать отчеты о пуле использования в командах, управлять группами организации, а также просматривать или обновлять доступ к моделям. Для этого используются API-ключ организации и те же шаблоны HTTP, что и Admin API команды.
- API организации использует базовую аутентификацию, где в качестве имени пользователя выступает ваш API-ключ.
- Подробнее о создании API-ключей, методах аутентификации, ограничении частоты запросов и рекомендациях по лучшим практикам см. в разделе Обзор API.
API-ключи организации и команды
API-ключи организации — это учетные данные, действующие на уровне организации. API-ключи команды — это учетные данные, действующие на уровне команды.
Используйте API-ключ организации при вызове конечных точек уровня организации, таких как /organizations/team-memberships/sync, /organizations/pooled-usage и /organizations/groups.
Используйте API-ключ команды при вызове конечных точек уровня команды в /teams/* (например, /teams/members и /teams/spend).
Ключевые различия
- Область действия: API-ключи организации могут действовать во всех командах, связанных с одной и той же организацией. API-ключи команды могут действовать только в рамках одной команды.
- Совместимость с конечными точками: Для конечных точек организации требуются API-ключи организации. Для конечных точек команды требуются API-ключи команды.
- Области действия ключей: Для каждого маршрута требуется определённая область действия ключа. Маршруты участников в режиме только для чтения принимают
members:read; для маршрутов записи участников и групп нуженmembers:*; для маршрутов использования нуженusage:*. Ключи сadmin:*работают везде, потому чтоadminподразумевает и остальные области действия. - Ошибки авторизации: Если область действия ключа не соответствует области действия конечной точки, запросы завершаются ошибками аутентификации или авторизации (обычно
401или403).
Области действия
Каждый API-ключ организации имеет ровно одну область действия. Маршрут доступен, только если его покрывает область действия ключа. Более широкие области действия включают всё, что разрешают более узкие.
| Область действия | Доступ | Примеры маршрутов |
|---|---|---|
members:read | Доступ только для чтения к данным о членстве в организации. | GET /organizations/members |
members:* | Доступ на чтение и запись к данным о членстве в организации и группах. Включает всё, что разрешает members:read. | GET /organizations/members, POST /organizations/team-memberships/sync, все маршруты /organizations/groups |
usage:* | Доступ на чтение к пулу использования и отчётности. | POST /organizations/pooled-usage, POST /organizations/filtered-usage-events, POST /organizations/daily-usage-data, POST /organizations/spend |
models:read | Доступ только для чтения к конфигурации Model Access и спискам поставщиков. | GET /organizations/teams/model-access/configuration, GET /organizations/teams/{teamId}/model-access/configuration, GET /organizations/teams/{teamId}/model-access/providers |
models:* | Доступ на чтение и запись к Model Access. Включает всё, что разрешает models:read. | Все маршруты Model Access, включая массовое переключение поставщиков и моделей и массовую конфигурацию |
admin:* | Полный доступ ко всем маршрутам организации. | Всё вышеперечисленное |
Выбирайте минимально необходимую область действия для задачи. Используйте members:read для интеграций только для чтения, которые выводят список участников, но не изменяют членство в организации. Используйте models:read или models:* для автоматизации Model Access без предоставления полного доступа администратора. Вы можете выбрать эти области действия, когда создаёте API-ключ организации в дашборде.
Как передавать API-ключ организации?
Передавайте его так же, как и другие API-ключи Cursor: через базовую аутентификацию, где ключ используется как имя пользователя, а пароль остаётся пустым.
curl -X POST https://api.cursor.com/organizations/team-memberships/sync \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123", "users": [ { "userId": 12345, "destinationTeamId": 7 } ] }'Участники
Просмотр участников организации и их перемещение между командами, связанными с вашей организацией.
- Доступность: только для Enterprise
- Аутентификация: API-ключ организации (базовая аутентификация). Для просмотра участников поддерживается область
members:readтолько для чтения; для перемещения участников требуетсяmembers:*. Ключи с областьюadmin:*подходят для обоих случаев. - Область действия:
GET /organizations/membersработает на уровне организации, поддерживает пагинацию и в одном ответе возвращает роль каждого участника в организации, а также его назначения во всех связанных командах. - Пагинация:
GET /organizations/membersподдерживаетpageиpageSize. ЗначениеpageSizeограничено 200; если указать больше, оно будет приведено к 200.
Список участников организации
/organizations/membersВозвращает участников организации, связанной с вашим API-ключом, а также роль каждого участника в организации и его назначения в связанных командах. Результаты поддерживают пагинацию.
Параметры запроса
page number
pageSize number
Поля ответа
members array
userIdnumber - Уникальный числовой идентификатор участника, совпадающий с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": [ { "userId": 12345, "email": "developer@company.com", "name": "Alex", "organizationRole": "member", "teams": [ { "teamId": 7, "teamRole": "member" }, { "teamId": 8, "teamRole": "owner" } ] }, { "userId": 12346, "email": "admin@company.com", "name": "Sam", "organizationRole": "admin", "teams": [ { "teamId": 7, "teamRole": "owner" } ] } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Синхронизация участников команд организации
/organizations/team-memberships/syncЗадайте команды, к которым принадлежат один или несколько пользователей в вашей организации. Это соответствует массовому формату 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, когда связанная команда не может загрузить конфигурацию.
Группы организации
Группы организации позволяют упорядочивать участников из команд, связанных с одной и той же организацией. Информацию о настройке дашборда и элементах управления на уровне группы см. в разделе Группы организации.
- Аутентификация: API-ключ организации (базовая аутентификация). Маршруты для чтения требуют область действия
members:*. Маршруты для записи также требуютmembers:*. Ключи сadmin:*тоже работают, так какadminвключаетmembers. - ID групп: идентификаторы групп организации используют префикс
g_. - Пагинация: Маршруты списка принимают
pageиpageSize. Оба значения должны быть положительными целыми числами.
Список групп организации
/organizations/groupsВозвращает группы организации, связанной с вашим API-ключом.
Параметры запроса
page number
pageSize number
curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Ответ:
{ "groups": [ { "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy", "name": "Engineering", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-20T14:22:00.000Z" }, { "id": "g_kljUvI0ASZORvSEXf9hV0ydcso", "name": "Design", "createdAt": "2026-01-16T09:00:00.000Z", "updatedAt": "2026-01-16T09:00:00.000Z" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Получить группу организации
/organizations/groups/:groupIdВозвращает одну группу организации.
Параметры
groupId string Обязательный
g_.curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \ -u YOUR_ORGANIZATION_API_KEY:Ответ:
{ "group": { "id": "g_PDSPmvukpYgZEDXsoNirw3CFhy", "name": "Engineering", "createdAt": "2026-01-15T10:30:00.000Z", "updatedAt": "2026-01-20T14:22:00.000Z" }}Список участников группы организации
/organizations/groups/:groupId/membersВозвращает участников группы организации.
Параметры
groupId string Обязательно
g_.Параметры запроса
page number
pageSize number
curl -X GET "https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Ответ:
{ "members": [ { "userId": "user_abc123", "name": "Alex Developer", "email": "alex@company.com", "joinedAt": "2026-01-15T10:30:00.000Z" }, { "userId": "user_def456", "name": "Sam Engineer", "email": "sam@company.com", "joinedAt": "2026-01-16T09:15:00.000Z" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Добавление участников в группу организации
/organizations/groups/:groupId/members/bulk-addДобавляет участников в группу организации.
Параметры
groupId string Обязательно
g_.Тело запроса
userIds string[] Обязательно
user_. Один запрос может включать до 100 пользователей.curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-add \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "userIds": ["user_abc123", "user_def456"] }'Ответ:
{ "addedCount": 2}Удаление участников из группы организации
/organizations/groups/:groupId/members/bulk-removeУдаляет участников из группы организации.
Параметры
groupId string Обязательно
g_.Тело запроса
userIds string[] Обязательно
user_. Один запрос может включать до 100 пользователей.curl -X POST https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members/bulk-remove \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "userIds": ["user_def456"] }'Ответ:
{ "removedCount": 1}