API da organização
A API da organização permite que você realize ações que se aplicam a todas as equipes vinculadas a uma organização, como mover usuários entre essas equipes, gerar relatórios sobre uso compartilhado entre equipes, gerenciar grupos da organização e ler ou atualizar o acesso a modelos. Ela usa uma chave de API da organização e os mesmos padrões HTTP da API de administração da equipe.
- A API da organização usa Autenticação Básica com sua chave de API como nome de usuário.
- Para obter detalhes sobre como criar chaves de API, métodos de autenticação, limites de taxa e boas práticas, consulte a Visão geral da API.
Chaves de API da organização vs. chaves de API da equipe
As chaves de API da organização são credenciais com escopo da organização. As chaves de API da equipe são credenciais com escopo da equipe.
Use uma chave de API da organização ao chamar endpoints no nível da organização, como /organizations/team-memberships/sync, /organizations/pooled-usage e /organizations/groups.
Use uma chave de API da equipe ao chamar endpoints em /teams/* (por exemplo, /teams/members e /teams/spend).
Diferenças principais
- Escopo: As chaves de API da organização podem ser usadas em equipes vinculadas à mesma organização. As chaves de API da equipe só podem ser usadas em uma única equipe.
- Compatibilidade de endpoint: Os endpoints da organização exigem chaves de API da organização. Os endpoints da equipe exigem chaves de API da equipe.
- Escopos da chave: Cada rota exige um escopo específico na chave. As rotas de associação somente leitura aceitam
members:read; as rotas de escrita de associação e grupo precisam demembers:*; as rotas de uso precisam deusage:*. Chaves comadmin:*funcionam em qualquer rota, porqueadmininclui os outros escopos. - Falhas de autorização: Se o escopo da chave não corresponder ao escopo do endpoint, as solicitações falharão com erros de autenticação ou autorização (geralmente
401ou403).
Escopos
Toda chave de API da organização tem exatamente um escopo. Uma rota só funciona quando o escopo da chave a abrange. Escopos mais amplos abrangem tudo o que os mais restritos permitem.
| Escopo | Acesso | Rotas de exemplo |
|---|---|---|
members:read | Acesso somente leitura à associação da organização. | GET /organizations/members |
members:* | Acesso de leitura e escrita à associação e aos grupos. Inclui tudo o que members:read permite. | GET /organizations/members, POST /organizations/team-memberships/sync, todas as rotas /organizations/groups |
usage:* | Acesso de leitura ao uso compartilhado e aos relatórios. | POST /organizations/pooled-usage, POST /organizations/filtered-usage-events, POST /organizations/daily-usage-data, POST /organizations/spend |
models:read | Acesso somente leitura à configuração de acesso a modelos e aos catálogos de provedores. | GET /organizations/teams/model-access/configuration, GET /organizations/teams/{teamId}/model-access/configuration, GET /organizations/teams/{teamId}/model-access/providers |
models:* | Acesso de leitura e escrita ao acesso a modelos. Inclui tudo o que models:read permite. | Todas as rotas de acesso a modelos, incluindo controles em massa para ativar/desativar provedores e modelos e configuração em massa |
admin:* | Acesso total a todas as rotas da organização. | Todas as rotas acima |
Escolha o escopo mais restrito para a tarefa. Use members:read para integrações somente leitura que listam membros, mas nunca alteram a associação. Use models:read ou models:* para automação de acesso a modelos sem conceder acesso total de administrador. Você pode selecionar esses escopos ao criar uma chave de API da organização no dashboard.
Como devo enviar uma chave de API da organização?
Envie-a da mesma forma que as outras chaves de API do Cherri Code: Autenticação Básica, com a chave como nome de usuário e a senha em branco.
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 } ] }'Membros
Consulte a associação da organização e mova membros entre as equipes vinculadas à sua organização.
- Disponibilidade: somente para Enterprise
- Autenticação: chave de API da organização (Basic auth). A leitura de membros aceita o escopo de somente leitura
members:read; mover membros requermembers:*. Chaves comadmin:*funcionam para ambos. - Escopo:
GET /organizations/memberstem escopo de organização, é paginado e retorna a função de organização de cada membro, além de todas as atribuições a equipes vinculadas, em uma única resposta. - Paginação:
GET /organizations/membersaceitapageepageSize.pageSizeé limitado a 200; valores maiores são ajustados para 200.
Listar membros da organização
/organizations/membersRecupera os membros da organização associada à sua chave de API, junto com a função de cada membro na organização e suas atribuições nas equipes vinculadas. Os resultados são paginados.
Parâmetros de consulta
page number
pageSize number
Campos da resposta
members matriz
userIdnumber - Identificador numérico exclusivo do membro, correspondente aoidretornado pelo endpoint de equipeGET /teams/membersemailstring - Endereço de email do membronamestring - Nome de exibição do membroorganizationRolestring - Função na organização,adminoumember. Isso é diferente deteamRoleem cada equipe: um usuário pode seradminna organização e ter a funçãomemberem uma equipe específica, ou vice-versa.teamsmatriz - As atribuições do membro nas equipes vinculadas à organização. Cada objeto contém:teamIdnumber - ID inteiro de uma equipe vinculada da qual o membro faz parteteamRolestring - Função nessa equipe (por exemplo,member,owner)
pagination object
page, pageSize, totalCount, totalPages, hasNextPage e hasPreviousPage.curl -X GET "https://api.cursor.com/organizations/members?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Resposta:
{ "members": [ { "userId": 12345, "email": "[email protected]", "name": "Alex", "organizationRole": "member", "teams": [ { "teamId": 7, "teamRole": "member" }, { "teamId": 8, "teamRole": "owner" } ] }, { "userId": 12346, "email": "[email protected]", "name": "Sam", "organizationRole": "admin", "teams": [ { "teamId": 7, "teamRole": "owner" } ] } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Sincronizar associações de membros de equipes da organização
/organizations/team-memberships/syncDefina as equipes às quais um ou mais usuários pertencem na sua organização. Isso segue o estilo em lote da API de importação CSV: você envia uma matriz de usuários e recebe uma linha de resultado para cada um.
Cada entrada deve usar exatamente um dos campos teamIds ou destinationTeamId:
teamIdsé o conjunto completo de IDs de equipe aos quais o usuário deve pertencer. O endpoint ajusta as associações do usuário para corresponder exatamente a esse conjunto. Ele adiciona todas as equipes listadas das quais o usuário ainda não faz parte e remove todas as equipes que não estiverem listadas. Para manter um usuário na equipe atual enquanto adiciona outra durante uma migração, liste ambas (por exemplo,[oldTeamId, newTeamId]).destinationTeamIdcoloca o usuário em uma única equipe. Ele é colocado na equipe especificada e removido de todas as outras. DefinirdestinationTeamId: NNNé funcionalmente equivalente ateamIds: [NNN].
Corpo da solicitação
organizationId string Obrigatório
org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.users array Obrigatório
teamIds ou destinationTeamId):userIdnumber | string: ID do usuário a ser sincronizado. Aceita um ID numérico inteiro (por exemplo,12345) ou um ID em formato string (por exemplo,"user_abc123").teamIdsnumber[]: O conjunto completo de IDs das equipes vinculadas à org às quais o usuário deve pertencer após a sincronização. As associações são reconciliadas para corresponder exatamente a esse conjunto. Qualquer equipe não listada é removida. Inclua as equipes atuais do usuário para mantê-las (por exemplo,[7, 8]). No máximo 100 equipes por entrada.destinationTeamIdnumber: Campo para sincronizar com uma única equipe. DefinirdestinationTeamId: NNNé o mesmo que enviarteamIds: [NNN]. As equipes do usuário passam a ser exatamente essa única equipe. Deve ser uma equipe vinculada à organização.
teamIds ou destinationTeamId por entrada.Resposta de sucesso (HTTP 200)
results matriz
userId, os teamIds resolvidos para aquela entrada e status: "success" ou status: "error" com errorMessage quando aquela linha falhar. Entradas enviadas com destinationTeamId também ecoam destinationTeamId (a primeira equipe em teamIds).successCount number
status: "success".errorCount number
status: "error".- Disponibilidade: somente para Enterprise
- Autenticação: chave da API da organização (Basic auth). A chave deve incluir o escopo
members:*para esta rota; chaves comadmin:*também funcionam, porqueadminimplicamembers. - Correspondência da organização: o
organizationIdno corpo deve ser da mesma organização que a chave da API; caso contrário, a solicitação será rejeitada. - Conjunto de equipes:
teamIdsé o conjunto exato de equipes às quais o usuário deverá pertencer após a chamada. O usuário será removido de qualquer equipe NÃO listada, portanto inclua as equipes atuais do usuário no conjunto para mantê-las. - Um campo de equipe por entrada: forneça exatamente um entre
teamIdsoudestinationTeamIdpara cada entrada. - Limite de equipes por entrada: o
teamIdsde uma entrada pode listar no máximo 100 equipes. - O usuário de destino já deve ser membro da organização para que a sincronização seja bem-sucedida.
- Cada equipe na entrada deve estar vinculada à organização para que a sincronização seja bem-sucedida.
- Se uma entrada em
usersfalhar, as outras ainda poderão ser bem-sucedidas; verifique ostatuse oerrorMessagede cada entrada emresults. - Tamanho do lote: uma única solicitação pode incluir até 500 entradas. Envie lotes adicionais em solicitações separadas, se necessário.
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 } ] }'A primeira entrada vincula o usuário 12345 exatamente às equipes 7 e 8 (adicionando qualquer uma das equipes às quais o usuário ainda não pertence e removendo qualquer outra equipe vinculada). A segunda entrada usa destinationTeamId, que é o mesmo que enviar teamIds: [8].
Resposta:
{ "results": [ { "userId": 12345, "teamIds": [7, 8], "status": "success" }, { "userId": "user_abc123", "teamIds": [8], "destinationTeamId": 8, "status": "success" } ], "successCount": 2, "errorCount": 0}Respostas de erro:
A maioria dos erros retornados pela API usa HTTP 401, 403 ou 400 e tem um corpo JSON no formato:
{ "code": "error", "message": "…"}404: organização não encontrada (esta rota usa um nome do campo diferente para a mensagem):
{ "error": "Organization not found"}401: chave da API da organização inválida (chave incorreta ou ausente):
{ "code": "error", "message": "Invalid Organization API Key"}401: escopo obrigatório ausente (a chave é válida, mas não inclui members:* ou admin:*):
{ "code": "error", "message": "Organization API key missing required scope: members:*"}403: a organização não corresponde à chave (organizationId no corpo da requisição não é a organização desta chave de API):
{ "code": "error", "message": "Not authorized"}400: corpo da solicitação inválido (exemplos; apenas um se aplica a cada solicitação com falha):
{ "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"}Falhas por linha (HTTP 200): Regras de validação ou de negócio para uma única entrada são retornadas em results com status: "error" e errorMessage. Os exemplos abaixo usam destinationTeamId, então as linhas repetem destinationTeamId; entradas enviadas com teamIds repetem teamIds em vez disso. Tipos inválidos de userId / destinationTeamId usam 0 para o campo inválido na linha:
{ "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}Falhas por linha (HTTP 200): Na lógica de sync, quando as entradas estão corretamente tipadas, mas a alteração não pode ser aplicada:
{ "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}Uso
Relatórios de uso de todas as equipes vinculadas à sua organização. Esses endpoints agregam dados de todas as equipes no pool da organização, então você não precisa de uma chave de API de equipe separada para cada equipe. Para relatórios de uma única equipe, use os endpoints de uso da API de administração da equipe.
- Disponibilidade: somente para Enterprise
- Autenticação: chave de API da organização (Basic auth). A chave deve incluir o escopo
usage:*para estas rotas; chaves comadmin:*também funcionam, porque admin inclui usage. - Correspondência da organização: o
organizationIdno corpo deve ser da mesma organização da chave de API; caso contrário, a solicitação será rejeitada. - Pertencimento à equipe: todos os itens em
teamIdsdevem pertencer à organização. Solicitações que fazem referência a uma equipe fora da organização são rejeitadas. - Polling: os dados de uso são agregados por hora. Consulte estes endpoints no máximo uma vez por hora. Limite de 20 solicitações por minuto. Consulte limites de taxa e boas práticas.
Obter uso compartilhado
/organizations/pooled-usageRetorna o uso compartilhado da organização: o limite de gastos do pool, o uso total em toda a organização e um detalhamento por equipe. Esses dados alimentam a seção de uso compartilhado do dashboard. Todos os campos monetários estão em centavos.
Corpo da solicitação
organizationId string Obrigatório
org_abc123). Deve corresponder à organização da chave da API da organização usada para chamar o endpoint.Campos da resposta
pool object
limitCentsnumber - Limite de gastos compartilhados da organização, em centavosusedCentsnumber - Total de uso compartilhado consumido até o momento, em centavosremainingCentsnumber - Orçamento compartilhado restante (limitCentsmenosusedCents), em centavoscontractStartDatestring | null - Timestamp ISO 8601 que marca o início do período atual do contrato, ounullquando nenhuma data de contrato está definidacontractEndDatestring | null - Timestamp ISO 8601 que marca o fim do período atual do contrato, ounullquando nenhuma data de contrato está definida
teams matriz
usedCents é igual a pool.usedCents. Cada objeto contém:teamIdnumber - ID inteiro de uma equipe vinculada à organizaçãousedCentsnumber - Uso consumido por esta equipe durante o período atual do contrato, em centavosbudgetLimitCentsnumber | undefined - Limite de orçamento por equipe em centavos. Presente apenas quando há um orçamento configurado para a equipe.
curl -X POST https://api.cursor.com/organizations/pooled-usage \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "organizationId": "org_abc123" }'Resposta:
{ "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 } ]}Obter Eventos de Uso
/organizations/filtered-usage-eventsRecupere eventos de uso detalhados das equipes vinculadas à sua organização. Este é o equivalente em nível organizacional ao endpoint de equipe /teams/filtered-usage-events: ele retorna o mesmo formato de evento, com cada evento marcado pelo teamId da equipe proprietária.
Por padrão, são retornados eventos de todas as equipes no pool da organização. Passe teamIds para limitar a resposta a equipes específicas.
Cálculo de custos: Some os valores do campo chargedCents em todos os eventos para conciliar os custos no nível do evento com o detalhamento de usedCents por equipe em /organizations/pooled-usage. Este campo inclui tanto o custo do modelo quanto a Taxa de Tokens do Cherri Code quando uma solicitação é elegível para a taxa.
O campo cursorTokenFee representa a Taxa de Tokens do Cherri Code e está presente apenas quando a taxa se aplica a uma solicitação para um modelo de terceiros. Isso inclui quando o Auto roteia para um modelo de terceiros. Modelos próprios do Cherri Code como Grok e Composer e contas corporativas com cobrança por solicitação não incluem essa taxa. Consulte Taxa de Tokens do Cherri Code.
Corpo da solicitação
organizationId string Obrigatório
org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.teamIds number[]
startDate number
endDate number
userId number
email string
serviceAccountId string
page number
1pageSize number
10Campos da Resposta
Cada objeto em usageEvents contém os mesmos campos do endpoint de equipe, além de uma tag da equipe proprietária:
teamIdnumber - ID inteiro da equipe à qual este evento pertencetimestampstring - Timestamp do evento em milissegundos Unix (como string)userEmailstring - Endereço de e-mail do usuário que fez a solicitaçãoserviceAccountIdstring | undefined - ID da conta de serviço que fez a solicitação. Não é informado em eventos de usuários humanos.serviceAccountNamestring | undefined - Nome de exibição da conta de serviço que fez a solicitação. Não incluído em eventos de usuários humanos.modelstring - modelo de IA usado na solicitaçãokindstring - Categoria de faturamento (por exemplo,Usage-based,Included in Business)maxModeboolean - Se a solicitação usou o modo MaxrequestsCostsnumber - Custo em unidades de solicitaçãoisTokenBasedCallboolean - Indica se a solicitação foi cobrada com base no uso de tokensisChargeablebooleano - Indica se este evento gera cobrançaisHeadlessbooleano - Indica se esta solicitação foi feita sem um cliente conectado (por exemplo, agentes em segundo plano)tokenUsageobject | undefined - Detalhes do uso de tokens (presente quandoisTokenBasedCallétrue):inputTokensnumber - Tokens de entrada consumidosoutputTokensnumber - Tokens de saída geradoscacheWriteTokensnumber - Tokens gravados no cachecacheReadTokensnumber - Tokens lidos do cachetotalCentsnumber - Custo total do modelo em centavosdiscountPercentOffnumber | undefined - Percentual de desconto aplicado, se houver
chargedCentsnumber - Valor total cobrado em centavos por este evento. Para solicitações a modelos de terceiros sujeitas à Taxa de Tokens do Cherri Code, isso inclui o custo do modelo mais a Taxa de Tokens do Cherri Code.cursorTokenFeenumber | undefined - Taxa de Tokens do Cherri Code em centavos. Presente apenas quando a taxa se aplica a uma solicitação a modelo de terceiros (inclusive quando o Auto roteia para um modelo de terceiros).
# Eventos de todas as equipes no pool da organizaçãocurl -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 }'# Eventos restritos a equipes específicascurl -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 }'Resposta:
{ "totalUsageEventsCount": 113, "pagination": { "numPages": 12, "currentPage": 1, "pageSize": 10, "hasNextPage": true, "hasPreviousPage": false }, "usageEvents": [ { "teamId": 7, "timestamp": "1750979225854", "userEmail": "[email protected]", "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": "[email protected]", "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 }}Obter Dados de Uso Diário
/organizations/daily-usage-dataRecupera métricas de uso diário de todos os membros das equipes vinculadas à sua organização. Este é o equivalente em nível organizacional ao endpoint da equipe /teams/daily-usage-data, com cada linha marcada pelo teamId proprietário. Os resultados são paginados por usuário e retornam dados de todos os membros que tiveram associação durante o intervalo de datas solicitado; use page e pageSize para percorrê-los.
Corpo da solicitação
organizationId string Obrigatório
org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.startDate number
endDate number
teamIds number[]
page number
1pageSize number
1000userEmail string
userEmails é aceito como alias.O intervalo de datas não pode ultrapassar 30 dias. Faça várias solicitações para períodos mais longos.
Os campos subscriptionIncludedReqs, usageBasedReqs e apiKeyReqs contam eventos de uso brutos, não unidades de solicitação faturáveis do antigo modelo de precificação por solicitação.
Campos de Resposta
Cada objeto na array data contém os mesmos campos do endpoint de uso diário da equipe, além de um teamId. Campos principais:
userIdstring - ID de usuário codificado com o prefixouser_(por exemplo,user_abc123)teamIdnumber - ID da equipe vinculada à organização a que esta linha pertencedaystring - A data abrangida por este registro (data ISO, por exemplo,2024-03-18)datenumber - Data em milissegundos desde a época Unixemailstring - Endereço de e-mail do usuárioisActivebooleano - Indica se o usuário teve atividade neste diatotalLinesAddednumber - Total de linhas de código adicionadastotalLinesDeletednumber - Total de linhas de código excluídasacceptedLinesAddednumber - linhas adicionadas sugeridas por AI e aceitasacceptedLinesDeletednumber - linhas excluídas sugeridas por AI que foram aceitastotalAppliesnumber - Total de ações de aplicação de código com IAtotalAcceptsnumber - Número total de sugestões de AI aceitastotalRejectsnumber - Número total de sugestões de AI rejeitadastotalTabsShownnumber - Número total de Tab Completions exibidas ao usuáriototalTabsAcceptednumber - Total de Tab completions aceitas pelo usuáriocomposerRequestsnumber - Número de solicitações feitas no ComposerchatRequestsnumber - Número de solicitações de chat realizadasagentRequestsnumber - Número de solicitações feitas no modo AgentcmdkUsagesnumber - Número de usos do Inline edit com Cmd+KsubscriptionIncludedReqsnumber - Solicitações incluídas no plano de assinaturaapiKeyReqsnumber - Solicitações feitas com a API keyusageBasedReqsnumber - Solicitações de uso excedentebugbotUsagesnumber - Número de usos do BugbotmostUsedModelstring | null - Modelo de IA usado com mais frequência no diaapplyMostUsedExtensionstring | null - Extensão de arquivo mais comum nas ações de applytabMostUsedExtensionstring | null - Extensão de arquivo mais comum nas Tab CompletionsclientVersionstring | null - versão do cliente do Cherri Code usada
A resposta também inclui um objeto pagination (page, pageSize, totalUsers, totalPages, hasNextPage, hasPreviousPage) e um objeto 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 }'Resposta:
{ "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": "[email protected]" } ], "period": { "startDate": 1710720000000, "endDate": 1710892800000 }, "pagination": { "page": 1, "pageSize": 1000, "totalUsers": 150, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Obter dados de gastos
/organizations/spendRecupere os gastos por membro em todas as equipes vinculadas à sua organização. Esta é a contraparte, em nível de organização, do endpoint de equipe /teams/spend, com cada membro identificado pelo teamId da equipe à qual pertence. Diferentemente do endpoint de equipe, os gastos são informados com base no período do contrato da organização (e não nos ciclos de faturamento de cada equipe), usando a mesma definição de gastos incluídos de /organizations/pooled-usage, para que os valores correspondam ao pool.
Corpo da solicitação
organizationId string Obrigatório
org_abc123). Deve corresponder à organização da chave da API da organização usada para chamar o endpoint.teamIds number[]
sortBy string
email, name, spendCents. Padrão: emailsortDirection string
asc, desc. Padrão: ascpage number
1pageSize number
100Os gastos são informados em todas as equipes do pool da organização, portanto os campos de equipe única subscriptionCycleStart, overallSpendCents, fastPremiumRequests, hardLimitOverrideDollars e monthlyLimitDollars de /teams/spend não são incluídos. O período do relatório é retornado em period.
Campos da resposta
Cada objeto em teamMemberSpend contém:
userIdstring - ID do usuário codificado com o prefixouser_(por exemplo,user_abc123)teamIdnumber - ID da equipe vinculada à organização à qual este membro pertencenamestring - Nome de exibição do usuárioemailstring - Endereço de email do usuáriorolestring - Função na equipe (por exemplo,member,owner)spendCentsnumber - Gastos incluídos no pool, em centavos, atribuídos a este membro durante o período do contrato da organização
A resposta também inclui totalMembers (number), totalPages (number) e um objeto period (startDate, endDate em milissegundos epoch) que descreve o período do contrato da organização.
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 }'Resposta:
{ "teamMemberSpend": [ { "userId": "user_abc123", "teamId": 101, "name": "Alex", "email": "[email protected]", "role": "member", "spendCents": 2450 }, { "userId": "user_def456", "teamId": 202, "name": "Sam", "email": "[email protected]", "role": "owner", "spendCents": 1875 } ], "totalMembers": 15, "totalPages": 1, "period": { "startDate": 1735689600000, "endDate": 1767225600000 }}Acesso a modelos
As rotas de acesso a modelos estão em prévia e podem mudar. Os caminhos, campos de resposta e o comportamento em caso de erro podem mudar antes da disponibilidade geral.
Leia e atualize a política de acesso a modelos das equipes vinculadas à organização. Essas rotas correspondem à API de acesso a modelos das equipes, restrita às equipes vinculadas.
Use a listagem e os GETs de cada equipe para identificar divergências de configuração. Alinhe as equipes usando PUTs de configuração e toggles de provedores/modelos (incluindo parameters por modelo). Não há endpoint de cópia nem impressão digital de política no nível da organização.
Habilitar um modelo sem configurações de parâmetros mantém os valores padrão do catálogo. Use a rota de modelo em massa quando valores padrão como Fast não corresponderem à política da sua organização.
Os valores numéricos de teamId vêm de rotas como GET /organizations/members.
- Disponibilidade: Organizações Enterprise. As equipes de destino devem ter o controle de acesso a modelos habilitado.
- Autenticação: Chave da API da organização (Basic auth). Operações de leitura exigem
models:read. Operações de gravação exigemmodels:*. Chaves comadmin:*funcionam para ambas. Chavesmembers:*,usage:*eread:*não podem chamar essas rotas. - Vínculo com a organização: Todo
teamIddeve estar vinculado à organização. Em rotas de equipe única, equipes desconhecidas ou não vinculadas retornam 404. Em rotas em massa, equipes não vinculadas são linhas de erro HTTP 200. - Configuração primeiro: Operações de leitura e gravação em provedores e modelos retornam 409 enquanto a equipe ainda estiver como
unrestricted(oulegacy). Primeiro, crie uma política personalizada comPUT /organizations/teams/{teamId}/model-access/configuration(ou a rota de configuração em massa). O primeiro PUT de valores padrão define os valores padrão do catálogo; ele não clona o mapa de ativação/desativação de outra equipe. - Retornar a unrestricted: Envie
{ "state": "unrestricted" }no PUT de configuração por equipe ou em massa. - Sucesso parcial em massa: Rotas em massa aceitam até 100
teamIdse sempre retornam HTTP 200 quando o lote é processado, mesmo que algumas linhas falhem. InspecioneerrorCounte todos osresults[].status. As linhas bem-sucedidas não são revertidas. As operações são idempotentes por equipe, portanto, tente novamente apenas osteamIds que falharam. Uma resposta 4xx ou 5xx rejeita toda a solicitação e não aplica alterações. O formato da resposta corresponde ao de/organizations/team-memberships/sync. - Limites de taxa: 20 solicitações por minuto. Operações de gravação aparecem nos logs de auditoria da equipe como eventos
team_settings. Consulte limites de taxa e boas práticas.
Listar configuração de acesso a modelos
/organizations/teams/model-access/configurationListe a configuração de acesso a modelos das equipes vinculadas. Use esta rota para identificar divergências entre políticas irrestritas e personalizadas. Para identificar divergências de ativação/desativação, faça GET dos provedores de cada equipe e compare.
Se uma equipe vinculada não tiver o controle de acesso a modelos habilitado, essa linha ainda retornará HTTP 200 e incluirá errorMessage em vez de state / valores padrão. As rotas GET e de gravação por equipe para essa equipe retornam 403.
Parâmetros de consulta
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:Resposta:
{ "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 }}Obter configuração de acesso a modelos da equipe
/organizations/teams/:teamId/model-access/configurationObtenha a configuração de uma equipe vinculada.
Parâmetros
teamId number Obrigatório
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/configuration \ -u YOUR_ORGANIZATION_API_KEY:Atualizar a configuração de acesso a modelos da equipe
/organizations/teams/:teamId/model-access/configurationCria ou atualiza a configuração de uma equipe vinculada ou retorna essa equipe ao acesso irrestrito. Usa o mesmo corpo e comportamento de inicialização da rota da equipe.
Parâmetros
teamId number Obrigatório
Corpo da solicitação
state string
unrestricted para remover a política. Omita ao enviar valores padrão.newProviderDefault string
enabled ou disabled. Obrigatório ao criar ou atualizar uma política personalizada; omita quando state for unrestricted.newModelDefault string
enabled ou disabled. Obrigatório ao criar ou atualizar uma política personalizada; omita quando state for 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" }'Retorne uma equipe vinculada ao acesso irrestrito:
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" }'Atualização em Massa da Configuração de Acesso a Modelos
/organizations/teams/model-access/configurationCrie ou atualize a configuração, ou defina o acesso como irrestrito, para várias equipes vinculadas. Até 100 teamIds por solicitação.
HTTP 200 significa que o lote foi processado, não que todas as entradas foram processadas com sucesso. Verifique errorCount e cada results[].status. As equipes processadas com sucesso mantêm a nova configuração. A operação é idempotente por equipe, portanto tente novamente apenas os teamIds que falharam. Uma resposta 4xx ou 5xx rejeita toda a solicitação e não aplica alterações.
Corpo da solicitação
teamIds number[] Obrigatório
state string
unrestricted para remover a política de cada equipe. Omita ao enviar valores padrão.newProviderDefault string
enabled ou disabled. Obrigatório ao criar ou atualizar políticas personalizadas; omita quando state for unrestricted.newModelDefault string
enabled ou disabled. Obrigatório ao criar ou atualizar políticas personalizadas; omita quando state for unrestricted.Defina os valores padrão de uma política personalizada para várias equipes:
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" }'Defina o acesso de várias equipes como irrestrito:
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" }'Resposta:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "A equipe não está vinculada a esta organização" } ], "successCount": 2, "errorCount": 1}Obter provedores de acesso a modelos da equipe
/organizations/teams/:teamId/model-access/providersLista os provedores e modelos de uma equipe vinculada, incluindo parameters por modelo (com a mesma estrutura da rota de provedores da equipe). Retorna 409 quando a equipe não tem uma política personalizada.
Parâmetros
teamId number Obrigatório
curl -X GET https://api.cursor.com/organizations/teams/7/model-access/providers \ -u YOUR_ORGANIZATION_API_KEY:Atualizar provedor de acesso a modelos da equipe
/organizations/teams/:teamId/model-access/providers/:providerHabilite ou desabilite um provedor em uma equipe vinculada. Retorna 409 quando a equipe não tem uma política personalizada.
Parâmetros
teamId number Obrigatório
provider string Obrigatório
openai).Corpo da solicitação
enabled boolean Obrigatório
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}'Atualizar modelo de acesso a modelos da equipe
/organizations/teams/:teamId/model-access/providers/:provider/models/:modelHabilite ou desabilite um modelo em uma equipe vinculada e, opcionalmente, defina parameters por modelo (com o mesmo corpo da rota de modelo da equipe). Retorna 409 quando a equipe não tem uma política personalizada.
Parâmetros
teamId number Obrigatório
provider string Obrigatório
anthropic).model string Obrigatório
claude-opus-4-6).Corpo da solicitação
enabled boolean Obrigatório
parameters object
{ allowedValues, defaultValue }. Os campos omitidos permanecem inalterados. allowedValues: null remove uma restrição. defaultValue: null restaura o padrão do catálogo. Consulte a documentação da equipe sobre Atualizar modelo de acesso a modelos.Desative o Fast em uma equipe vinculada:
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"] } } }'Defina o esforço de raciocínio padrão:
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" } } }'Atualização em massa de provedor de acesso a modelos
/organizations/teams/model-access/providers/:providerHabilite ou desabilite um provedor para várias equipes vinculadas. Até 100 teamIds por solicitação.
HTTP 200 significa que o lote foi processado, não que todas as linhas tenham sido bem-sucedidas. Verifique errorCount e cada results[].status. As linhas bem-sucedidas não são revertidas. A operação é idempotente por equipe, portanto, tente novamente apenas os teamIds que falharam. Uma resposta 4xx ou 5xx rejeita toda a solicitação e não aplica nenhuma alteração.
Parâmetros
provider string Obrigatório
openai).Corpo da solicitação
enabled boolean Obrigatório
teamIds number[] Obrigatório
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 }'Resposta:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "A equipe não tem uma política de acesso a modelos. Crie uma com PUT /teams/model-access/configuration ou habilite o acesso a modelos em Configurações da equipe → Modelos." } ], "successCount": 2, "errorCount": 1}Neste exemplo, o status HTTP ainda é 200 porque o lote foi concluído. As equipes 7 e 8 mantêm o provedor desabilitado; tente novamente apenas a equipe 9 após criar a configuração dela.
Atualização em massa do modelo de acesso a modelos
/organizations/teams/model-access/providers/:provider/models/:modelHabilite ou desabilite um modelo para várias equipes vinculadas, opcionalmente com o mesmo mapa de parameters usado no PUT de modelo para uma única equipe. Até 100 teamIds por solicitação.
HTTP 200 significa que o lote foi processado, não que todas as linhas tenham sido bem-sucedidas. Verifique errorCount e cada results[].status. As linhas bem-sucedidas não são revertidas. A operação é idempotente por equipe, portanto, tente novamente apenas os teamIds que falharam. Uma resposta 4xx ou 5xx rejeita toda a solicitação e não aplica alterações.
Parâmetros
provider string Obrigatório
anthropic).model string Obrigatório
claude-opus-4-6).Corpo da solicitação
enabled boolean Obrigatório
teamIds number[] Obrigatório
parameters object
allowedValues: null remove uma restrição. defaultValue: null restaura o padrão do catálogo.Desabilite o Fast nas equipes vinculadas:
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"] } } }'Defina o esforço de raciocínio padrão nas equipes vinculadas:
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" } } }'Resposta:
{ "results": [ { "teamId": 7, "status": "success" }, { "teamId": 8, "status": "success" }, { "teamId": 9, "status": "error", "errorMessage": "A equipe não tem uma política de acesso a modelos. Crie uma com PUT /teams/model-access/configuration ou habilite o acesso a modelos em Configurações da equipe → Modelos." } ], "successCount": 2, "errorCount": 1}Erros
Os corpos das respostas de erro usam:
{ "code": "error", "message": "…" }| Status | Quando |
|---|---|
401 | Chave inválida ou ausência de models:read / models:* (ou admin:*) |
403 | O controle de acesso a modelos não está disponível para essa equipe (rotas de equipe única) |
404 | A equipe não está vinculada à organização (rotas de equipe única) |
409 | Leitura de provedor ou modelo, ou gravação em equipe única, quando o state dessa equipe é unrestricted ou legacy |
400 | ID de provedor, modelo ou parâmetro desconhecido, ou valor de parâmetro desconhecido; body inválido; allowedValues vazio; valor padrão fora de allowedValues; configurações que não resultam em nenhuma variante de modelo válida; ou um modelo obrigatório do Smart Auto seria bloqueado |
As rotas em massa da organização (PUT .../providers/:provider, PUT .../providers/:provider/models/:model e PUT .../configuration com teamIds) retornam HTTP 200 quando o lote é processado, mesmo que algumas linhas falhem. Um errorCount diferente de zero ainda é uma resposta HTTP bem-sucedida. Equipes não vinculadas e erros públicos, como configuração ausente, aparecem como linhas com status: "error". Linhas bem-sucedidas não são revertidas. As operações são idempotentes por equipe, então tente novamente apenas os teamIds que falharam. Qualquer resposta 4xx ou 5xx significa que toda a solicitação foi rejeitada e nenhuma alteração foi aplicada. A rota de listagem também retorna HTTP 200 com uma linha errorMessage quando uma equipe vinculada não consegue carregar a configuração.
Grupos da organização
Os grupos da organização organizam membros entre equipes vinculadas à mesma organização. Para a configuração no dashboard e os controles em nível de grupo, consulte Grupos da organização. Os directory groups de equipe usam a Team Admin API em /teams/directory-groups e ids team_group_…. Essas rotas não aceitam valores de id (g_) ou publicId (grp_) de grupo da organização.
- Availability: somente para Enterprise
- Autenticação: Organization chave de API (Basic auth). Toda rota de grupo, de leitura ou gravação, exige o escopo
members:*. Chaves comadmin:*também funcionam, pois admin implica members. - IDs de grupo: cada grupo tem dois IDs.
id(prefixog_) é o ID de grupo da API da organização; use-o sempre que uma rota receber:groupId.publicId(prefixogrp_) é o public id do grupo. - Busca por nome: para encontrar os IDs de um grupo a partir do nome, chame Listar grupos da organização com o parâmetro de consulta
name. Nenhuma rota aceita um nome no lugar de:groupId. - Paginação: as rotas de listagem aceitam
pageepageSize. Ambos os valores devem ser integers positivos. - limite de taxa: cada rota permite 20 solicitações por minuto por organização. Consulte limites de taxa e boas práticas.
- Grupos sincronizados por SCIM: gerencie a associação no seu provedor de identidade. Solicitações de adição e remoção de membros retornam
400para grupos sincronizados por SCIM.
As rotas de grupo compartilham estas respostas de erro:
| Status | Quando |
|---|---|
400 | ID de grupo, valor de paginação ou corpo da solicitação malformado |
401 | chave de API inválida ou chave sem o escopo members:* (ou admin:*) |
404 | O grupo não existe na organização |
429 | Limite de taxa excedido. A resposta inclui um header Retry-After: 60 |
Listar grupos da organização
/organizations/groupsRetorna os grupos da organização associada à sua chave de API. Informe name para buscar um grupo pelo nome exato.
Parâmetros de consulta
page number
1.pageSize number
50. Limitado a 200; valores acima de 200 são reduzidos para 200.name string
Platform%20Engineering). Os nomes de grupos são únicos dentro de uma organização, portanto a resposta é o payload de lista normal com um grupo ou nenhum. Um nome sem correspondência retorna 200 com uma matriz groups vazia, e não 404. Omita name ou envie-o em branco para listar todos os grupos.Campos da resposta
Cada objeto em groups contém:
idstring - ID do grupo da organização com o prefixog_publicIdstring - ID público do grupo com o prefixogrp_namestring - Nome do grupomemberCountnumber - Número de membros no grupomonthlySpendingLimitDollarsnumber | null - Limite de gastos mensal em dólares inteiros para cada membro do grupo.nullsignifica que o grupo não tem limite.createdAtstring - Data de criação no formato ISO 8601updatedAtstring - Data da última atualização no formato ISO 8601
pagination object
page, pageSize, totalCount, totalPages, hasNextPage e hasPreviousPage.curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Buscar um grupo pelo nome:
curl -X GET "https://api.cursor.com/organizations/groups?name=Engineering" \ -u YOUR_ORGANIZATION_API_KEY:Resposta:
{ "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 }}Resposta (busca por nome):
{ "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 }}Obter grupo da organização
/organizations/groups/:groupIdRetorna um grupo da organização.
Parâmetros
groupId string Obrigatório
g_.Campos da resposta
O objeto group contém id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt e updatedAt. Esses campos correspondem aos da resposta de Listar grupos da organização.
curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \ -u YOUR_ORGANIZATION_API_KEY:Resposta:
{ "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" }}Criar grupo da organização
/organizations/groupsCria um grupo da organização com associação gerenciada manualmente. Para criar um grupo sincronizado por SCIM, sincronize-o a partir do seu provedor de identidade no dashboard.
Corpo da solicitação
name string Obrigatório
Campos da resposta
Retorna 201 Created com o novo objeto group. O objeto contém id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt e updatedAt.
Erros
400- O nome do grupo está ausente, vazio ou já é usado por outro grupo ativo.
curl -X POST https://api.cursor.com/organizations/groups \ -u YOUR_ORGANIZATION_API_KEY: \ -H "Content-Type: application/json" \ -d '{ "name": "Engineering" }'Resposta:
{ "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" }}Atualizar grupo da organização
/organizations/groups/:groupIdAtualize o nome ou o limite mensal de gastos de um grupo. As atualizações são parciais: inclua ao menos um campo; qualquer campo omitido mantém o valor atual.
Parâmetros
groupId string Obrigatório
g_.Corpo da solicitação
name string
monthlySpendingLimitDollars number
0 e 2147483647.clearMonthlySpendingLimitDollars boolean
true para remover o limite de gastos do grupo. Não inclua monthlySpendingLimitDollars na mesma solicitação.Campos da resposta
Retorna o objeto group atualizado com id, publicId, name, memberCount, monthlySpendingLimitDollars, createdAt e updatedAt.
Erros
400- A solicitação não tem campos de atualização, contém um valor inválido, usa o nome de outro grupo ativo ou define e remove o limite de gastos na mesma solicitação.
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 }'Resposta:
{ "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" }}Excluir grupo da organização
/organizations/groups/:groupIdExclui um grupo da organização. O grupo precisa estar vazio: remova todos os membros antes de excluí-lo.
Parâmetros
groupId string Obrigatório
g_.Resposta
Retorna 204 No Content após a exclusão do grupo.
Erros
400- O grupo ainda tem membros ou possui um mapeamento SCIM ativo.
Não é possível excluir um grupo com mapeamento SCIM ativo por este endpoint. Remova o mapeamento no dashboard, remova todos os membros e só então exclua o grupo.
curl -X DELETE https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \ -u YOUR_ORGANIZATION_API_KEY:Resposta: 204 No Content
Listar membros do grupo da organização
/organizations/groups/:groupId/membersRetorna os membros de um grupo da organização.
Parâmetros
groupId string Obrigatório
g_.Parâmetros de consulta
page number
1.pageSize number
50. Limitado a 200; valores acima de 200 são reduzidos para 200.Campos da resposta
Cada objeto em members contém:
userIdstring - ID público do usuário com o prefixouser_namestring - Nome de exibição do membroemailstring - Endereço de e-mail do membrojoinedAtstring - Horário em que o membro foi adicionado ao grupo, no formato ISO 8601
pagination object
page, pageSize, totalCount, totalPages, hasNextPage e hasPreviousPage.curl -X GET "https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy/members?page=1&pageSize=50" \ -u YOUR_ORGANIZATION_API_KEY:Resposta:
{ "members": [ { "userId": "user_abc123", "name": "Alex Developer", "email": "[email protected]", "joinedAt": "2026-01-15T10:30:00.000Z" }, { "userId": "user_def456", "name": "Sam Engineer", "email": "[email protected]", "joinedAt": "2026-01-16T09:15:00.000Z" } ], "pagination": { "page": 1, "pageSize": 50, "totalCount": 2, "totalPages": 1, "hasNextPage": false, "hasPreviousPage": false }}Adicionar membros a um grupo da organização
/organizations/groups/:groupId/members/bulk-addAdicione membros a um grupo manual da organização.
Parâmetros
groupId string Obrigatório
g_.Corpo da solicitação
userIds string[] Obrigatório
user_. Uma única solicitação pode incluir até 100 usuários.Campos da resposta
addedCount number
Grupos sincronizados por SCIM rejeitam alterações manuais de associação com uma resposta 400.
Gerencie a associação deles no seu provedor de identidade.
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"] }'Resposta:
{ "addedCount": 2}Remover membros de um grupo da organização
/organizations/groups/:groupId/members/bulk-removeRemova membros de um grupo manual da organização.
Parâmetros
groupId string Obrigatório
g_.Corpo da solicitação
userIds string[] Obrigatório
user_. Uma única solicitação pode incluir até 100 usuários.Campos da resposta
removedCount number
Grupos sincronizados por SCIM rejeitam alterações manuais de associação com uma resposta 400.
Gerencie a associação deles no seu provedor de identidade.
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"] }'Resposta:
{ "removedCount": 1}