Skip to main content

Command Palette

Search for a command to run...

API

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 de members:*; as rotas de uso precisam de usage:*. Chaves com admin:* funcionam em qualquer rota, porque admin inclui 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 401 ou 403).

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.

EscopoAcessoRotas de exemplo
members:readAcesso 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:readAcesso 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.

Listar membros da organização

GET/organizations/members

Recupera 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

Número da página (indexado a partir de 1). O padrão é a primeira página.

pageSize number

Número de membros por página. Limitado a 200; valores acima de 200 são ajustados para 200.

Campos da resposta

members matriz

Matriz de objetos de membro da organização, cada um contendo:
  • userId number - Identificador numérico exclusivo do membro, correspondente ao id retornado pelo endpoint de equipe GET /teams/members
  • email string - Endereço de email do membro
  • name string - Nome de exibição do membro
  • organizationRole string - Função na organização, admin ou member. Isso é diferente de teamRole em cada equipe: um usuário pode ser admin na organização e ter a função member em uma equipe específica, ou vice-versa.
  • teams matriz - As atribuições do membro nas equipes vinculadas à organização. Cada objeto contém:
    • teamId number - ID inteiro de uma equipe vinculada da qual o membro faz parte
    • teamRole string - Função nessa equipe (por exemplo, member, owner)

pagination object

Metadados de paginação: 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

POST/organizations/team-memberships/sync

Defina 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]).
  • destinationTeamId coloca o usuário em uma única equipe. Ele é colocado na equipe especificada e removido de todas as outras. Definir destinationTeamId: NNN é funcionalmente equivalente a teamIds: [NNN].

Corpo da solicitação

organizationId string Obrigatório

ID público da organização (por exemplo, org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.

users array Obrigatório

Lista não vazia de entradas (no máximo 500 por solicitação). Cada elemento é um objeto com um ID de usuário e exatamente um campo de equipe (teamIds ou destinationTeamId):
  • userId number | 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").
  • teamIds number[]: 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.
  • destinationTeamId number: Campo para sincronizar com uma única equipe. Definir destinationTeamId: NNN é o mesmo que enviar teamIds: [NNN]. As equipes do usuário passam a ser exatamente essa única equipe. Deve ser uma equipe vinculada à organização.
Forneça exatamente um dos campos teamIds ou destinationTeamId por entrada.

Resposta de sucesso (HTTP 200)

results matriz

Uma entrada por sincronização solicitada, em ordem. Cada objeto inclui 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

Número de linhas com status: "success".

errorCount number

Número de linhas com status: "error".
curl -X POST https://api.cursor.com/organizations/team-memberships/sync \  -u YOUR_API_KEY: \  -H "Content-Type: application/json" \  -d '{    "organizationId": "org_abc123",    "users": [      { "userId": 12345, "teamIds": [7, 8] },      { "userId": "user_abc123", "destinationTeamId": 8 }    ]  }'

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.

Obter uso compartilhado

POST/organizations/pooled-usage

Retorna 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

ID público da organização (por exemplo, org_abc123). Deve corresponder à organização da chave da API da organização usada para chamar o endpoint.

Campos da resposta

pool object

Totais do pool para o período atual do contrato:
  • limitCents number - Limite de gastos compartilhados da organização, em centavos
  • usedCents number - Total de uso compartilhado consumido até o momento, em centavos
  • remainingCents number - Orçamento compartilhado restante (limitCents menos usedCents), em centavos
  • contractStartDate string | null - Timestamp ISO 8601 que marca o início do período atual do contrato, ou null quando nenhuma data de contrato está definida
  • contractEndDate string | null - Timestamp ISO 8601 que marca o fim do período atual do contrato, ou null quando nenhuma data de contrato está definida

teams matriz

Detalhamento do uso por equipe. A soma de todos os usedCents é igual a pool.usedCents. Cada objeto contém:
  • teamId number - ID inteiro de uma equipe vinculada à organização
  • usedCents number - Uso consumido por esta equipe durante o período atual do contrato, em centavos
  • budgetLimitCents number | 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

POST/organizations/filtered-usage-events

Recupere 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.

Corpo da solicitação

organizationId string Obrigatório

ID público da organização (por exemplo org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.

teamIds number[]

Conjunto opcional de IDs inteiros de equipes para incluir. Cada um deve pertencer à organização. Quando omitido, todas as equipes no pool da organização são incluídas.

startDate number

Data de início em milissegundos desde epoch. Este limite é inclusivo.

endDate number

Data de término em milissegundos desde a época. Este limite é inclusivo.

userId number

Filtrar por ID de usuário específico.

email string

Filtrar pelo endereço de e-mail do usuário.

serviceAccountId string

Filtrar por ID da conta de serviço.

page number

Número da página (indexada a partir de 1). Padrão: 1

pageSize number

Número de resultados por página. Padrão: 10

Campos da Resposta

Cada objeto em usageEvents contém os mesmos campos do endpoint de equipe, além de uma tag da equipe proprietária:

  • teamId number - ID inteiro da equipe à qual este evento pertence
  • timestamp string - Timestamp do evento em milissegundos Unix (como string)
  • userEmail string - Endereço de e-mail do usuário que fez a solicitação
  • serviceAccountId string | undefined - ID da conta de serviço que fez a solicitação. Não é informado em eventos de usuários humanos.
  • serviceAccountName string | 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.
  • model string - modelo de IA usado na solicitação
  • kind string - Categoria de faturamento (por exemplo, Usage-based, Included in Business)
  • maxMode boolean - Se a solicitação usou o modo Max
  • requestsCosts number - Custo em unidades de solicitação
  • isTokenBasedCall boolean - Indica se a solicitação foi cobrada com base no uso de tokens
  • isChargeable booleano - Indica se este evento gera cobrança
  • isHeadless booleano - Indica se esta solicitação foi feita sem um cliente conectado (por exemplo, agentes em segundo plano)
  • tokenUsage object | undefined - Detalhes do uso de tokens (presente quando isTokenBasedCall é true):
    • inputTokens number - Tokens de entrada consumidos
    • outputTokens number - Tokens de saída gerados
    • cacheWriteTokens number - Tokens gravados no cache
    • cacheReadTokens number - Tokens lidos do cache
    • totalCents number - Custo total do modelo em centavos
    • discountPercentOff number | undefined - Percentual de desconto aplicado, se houver
  • chargedCents number - 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.
  • cursorTokenFee number | 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

POST/organizations/daily-usage-data

Recupera 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

ID público da organização (por exemplo org_abc123). Deve corresponder à organização da chave de API da Organização usada para chamar o endpoint.

startDate number

Data de início em milissegundos epoch. O padrão é 7 dias atrás.

endDate number

Data de término em milissegundos epoch. O padrão é agora.

teamIds number[]

Equipes vinculadas à organização para relatar. Quando omitido, todas as equipes no pool da organização são incluídas. No máximo 100 equipes por solicitação.

page number

Número da página (indexado a partir de 1). Padrão: 1

pageSize number

Número de usuários por página (1-1000). Padrão: 1000

userEmail string

Filtra para um ou mais usuários por e-mail. Aceita um único e-mail ou uma lista separada por vírgulas. userEmails é aceito como alias.

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:

  • userId string - ID de usuário codificado com o prefixo user_ (por exemplo, user_abc123)
  • teamId number - ID da equipe vinculada à organização a que esta linha pertence
  • day string - A data abrangida por este registro (data ISO, por exemplo, 2024-03-18)
  • date number - Data em milissegundos desde a época Unix
  • email string - Endereço de e-mail do usuário
  • isActive booleano - Indica se o usuário teve atividade neste dia
  • totalLinesAdded number - Total de linhas de código adicionadas
  • totalLinesDeleted number - Total de linhas de código excluídas
  • acceptedLinesAdded number - linhas adicionadas sugeridas por AI e aceitas
  • acceptedLinesDeleted number - linhas excluídas sugeridas por AI que foram aceitas
  • totalApplies number - Total de ações de aplicação de código com IA
  • totalAccepts number - Número total de sugestões de AI aceitas
  • totalRejects number - Número total de sugestões de AI rejeitadas
  • totalTabsShown number - Número total de Tab Completions exibidas ao usuário
  • totalTabsAccepted number - Total de Tab completions aceitas pelo usuário
  • composerRequests number - Número de solicitações feitas no Composer
  • chatRequests number - Número de solicitações de chat realizadas
  • agentRequests number - Número de solicitações feitas no modo Agent
  • cmdkUsages number - Número de usos do Inline edit com Cmd+K
  • subscriptionIncludedReqs number - Solicitações incluídas no plano de assinatura
  • apiKeyReqs number - Solicitações feitas com a API key
  • usageBasedReqs number - Solicitações de uso excedente
  • bugbotUsages number - Número de usos do Bugbot
  • mostUsedModel string | null - Modelo de IA usado com mais frequência no dia
  • applyMostUsedExtension string | null - Extensão de arquivo mais comum nas ações de apply
  • tabMostUsedExtension string | null - Extensão de arquivo mais comum nas Tab Completions
  • clientVersion string | 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

POST/organizations/spend

Recupere 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

ID público da organização (por exemplo, org_abc123). Deve corresponder à organização da chave da API da organização usada para chamar o endpoint.

teamIds number[]

Equipes vinculadas à organização sobre as quais o relatório será gerado. Quando omitido, todas as equipes do pool da organização são incluídas. No máximo 100 equipes por solicitação.

sortBy string

Ordenar por: email, name, spendCents. Padrão: email

sortDirection string

Direção da ordenação: asc, desc. Padrão: asc

page number

Número da página (indexado a partir de 1). Padrão: 1

pageSize number

Resultados por página (1-1000). Padrão: 100

Campos da resposta

Cada objeto em teamMemberSpend contém:

  • userId string - ID do usuário codificado com o prefixo user_ (por exemplo, user_abc123)
  • teamId number - ID da equipe vinculada à organização à qual este membro pertence
  • name string - Nome de exibição do usuário
  • email string - Endereço de email do usuário
  • role string - Função na equipe (por exemplo, member, owner)
  • spendCents number - 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

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.

Listar configuração de acesso a modelos

GET/organizations/teams/model-access/configuration

Liste 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

Número da página (a partir de 1).

pageSize number

Resultados por página.

teamIds string

IDs de equipe opcionais separados por vírgula, por exemplo, 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

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

Obtenha a configuração de uma equipe vinculada.

Parâmetros

teamId number Obrigatório

ID inteiro de uma equipe vinculada à organização.
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

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

Cria 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

ID inteiro de uma equipe vinculada à organização.

Corpo da solicitação

state string

Opcional. Use 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

PUT/organizations/teams/model-access/configuration

Crie 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

IDs das equipes vinculadas a serem atualizadas. Máximo de 100 por solicitação.

state string

Opcional. Use 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

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

Lista 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

ID inteiro de uma equipe vinculada à organização.
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

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

Habilite 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

ID inteiro de uma equipe vinculada à organização.

provider string Obrigatório

ID do provedor no catálogo (por exemplo, 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

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

Habilite 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

ID inteiro de uma equipe vinculada à organização.

provider string Obrigatório

ID do provedor no catálogo (por exemplo, anthropic).

model string Obrigatório

ID do modelo no catálogo (por exemplo, claude-opus-4-6).

Corpo da solicitação

enabled boolean Obrigatório

parameters object

Mapa opcional de ID de parâmetro para { 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

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

Habilite 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

ID do provedor no catálogo (por exemplo, openai).

Corpo da solicitação

enabled boolean Obrigatório

teamIds number[] Obrigatório

IDs das equipes vinculadas a atualizar. Máximo de 100 por solicitação.
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

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

Habilite 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

ID do provedor no catálogo (por exemplo, anthropic).

model string Obrigatório

ID do modelo no catálogo (por exemplo, claude-opus-4-6).

Corpo da solicitação

enabled boolean Obrigatório

teamIds number[] Obrigatório

IDs das equipes vinculadas a serem atualizadas. Máximo de 100 por solicitação.

parameters object

Opcional. Mesmo mapa do PUT de modelo de equipe única. 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": "…" }
StatusQuando
401Chave inválida ou ausência de models:read / models:* (ou admin:*)
403O controle de acesso a modelos não está disponível para essa equipe (rotas de equipe única)
404A equipe não está vinculada à organização (rotas de equipe única)
409Leitura de provedor ou modelo, ou gravação em equipe única, quando o state dessa equipe é unrestricted ou legacy
400ID 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.

As rotas de grupo compartilham estas respostas de erro:

StatusQuando
400ID de grupo, valor de paginação ou corpo da solicitação malformado
401chave de API inválida ou chave sem o escopo members:* (ou admin:*)
404O grupo não existe na organização
429Limite de taxa excedido. A resposta inclui um header Retry-After: 60

Listar grupos da organização

GET/organizations/groups

Retorna 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

Número da página. O padrão é 1.

pageSize number

Número de grupos por página. O padrão é 50. Limitado a 200; valores acima de 200 são reduzidos para 200.

name string

Nome exato de um grupo, codificado para URL (por exemplo, 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:

  • id string - ID do grupo da organização com o prefixo g_
  • publicId string - ID público do grupo com o prefixo grp_
  • name string - Nome do grupo
  • memberCount number - Número de membros no grupo
  • monthlySpendingLimitDollars number | null - Limite de gastos mensal em dólares inteiros para cada membro do grupo. null significa que o grupo não tem limite.
  • createdAt string - Data de criação no formato ISO 8601
  • updatedAt string - Data da última atualização no formato ISO 8601

pagination object

Metadados de paginação: 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

GET/organizations/groups/:groupId

Retorna um grupo da organização.

Parâmetros

groupId string Obrigatório

ID do grupo da organização com o prefixo 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

POST/organizations/groups

Cria 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

Nome do grupo. Deve ser único entre os grupos ativos da organização. O Cherri Code remove os espaços em branco no início e no fim.

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

PATCH/organizations/groups/:groupId

Atualize 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

ID do grupo da organização com o prefixo g_.

Corpo da solicitação

name string

Novo nome do grupo. Deve ser único entre os grupos ativos da organização. O Cherri Code remove os espaços em branco no início e no fim.

monthlySpendingLimitDollars number

Limite mensal de gastos, em dólares inteiros, para cada membro do grupo, entre 0 e 2147483647.

clearMonthlySpendingLimitDollars boolean

Defina como 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

DELETE/organizations/groups/:groupId

Exclui um grupo da organização. O grupo precisa estar vazio: remova todos os membros antes de excluí-lo.

Parâmetros

groupId string Obrigatório

ID do grupo da organização com o prefixo 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.
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

GET/organizations/groups/:groupId/members

Retorna os membros de um grupo da organização.

Parâmetros

groupId string Obrigatório

ID do grupo da organização com o prefixo g_.

Parâmetros de consulta

page number

Número da página. O padrão é 1.

pageSize number

Número de membros por página. O padrão é 50. Limitado a 200; valores acima de 200 são reduzidos para 200.

Campos da resposta

Cada objeto em members contém:

  • userId string - ID público do usuário com o prefixo user_
  • name string - Nome de exibição do membro
  • email string - Endereço de e-mail do membro
  • joinedAt string - Horário em que o membro foi adicionado ao grupo, no formato ISO 8601

pagination object

Metadados de paginação: 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

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

Adicione membros a um grupo manual da organização.

Parâmetros

groupId string Obrigatório

ID do grupo da organização com o prefixo g_.

Corpo da solicitação

userIds string[] Obrigatório

Matriz de IDs públicos de usuários com o prefixo user_. Uma única solicitação pode incluir até 100 usuários.

Campos da resposta

addedCount number

Número de associações criadas por esta solicitação. O Cherri Code ignora usuários fora da organização e usuários que já pertencem ao grupo, ou seja, eles não entram nesse total.
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

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

Remova membros de um grupo manual da organização.

Parâmetros

groupId string Obrigatório

ID do grupo da organização com o prefixo g_.

Corpo da solicitação

userIds string[] Obrigatório

Matriz de IDs públicos de usuários com o prefixo user_. Uma única solicitação pode incluir até 100 usuários.

Campos da resposta

removedCount number

Número de associações removidas por esta solicitação. O Cherri Code ignora usuários que não pertencem ao grupo, ou seja, eles não entram nesse total.
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}