A Admin API permite acessar programaticamente os dados da tua equipe, incluindo informações de membros, métricas de uso e detalhes de gastos. Cria dashboards personalizados, ferramentas de monitoramento ou integra com fluxos de trabalho existentes.
A API está na primeira versão. Estamos expandindo as funcionalidades com base no feedback — conta pra gente quais endpoints tu precisa!
Todas as solicitações à API exigem autenticação com uma chave de API. Só administradores da equipe podem criar e gerenciar chaves de API.
As chaves de API são vinculadas à organização, visíveis para todos os administradores e não são afetadas pelo status da conta do criador original.
- Vai em cursor.com/dashboard → aba Settings → Cursor Admin API Keys
- Clica em Create New API Key
- Dá um nome descritivo pra tua chave (ex.: “Usage Dashboard Integration”)
- Copia a chave gerada na hora — tu não vai ver ela de novo
Formato: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Usa tua API key como nome de usuário na autenticação básica:
Usando curl com basic auth:
curl https://api.cursor.com/{route} -u API_KEY:
Ou define o header Authorization diretamente:
Authorization: Basic {base64_encode('API_KEY:')}
Todos os endpoints da API utilizam:
Recupera todos os membros da equipe e seus detalhes.
Retorna um array de objetos de membros da equipe:
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "member"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "owner"
}
]
}
curl -X GET https://api.cursor.com/teams/members \
-u YOUR_API_KEY:
Obter dados de uso diários
Recupera métricas detalhadas de uso diário da tua equipe em um intervalo de datas. Traz insights sobre edições de código, uso de assistência de IA e taxas de aceitação.
POST /teams/daily-usage-data
Parâmetro | Tipo | Obrigatório | Descrição |
---|
startDate | number | Sim | Data de início em milissegundos desde a época (epoch) |
endDate | number | Sim | Data de término em milissegundos desde a época (epoch) |
O intervalo de datas não pode exceder 90 dias. Faz várias requisições para períodos mais longos.
{
data: {
date: number;
isActive: boolean;
totalLinesAdded: number;
totalLinesDeleted: number;
acceptedLinesAdded: number;
acceptedLinesDeleted: number;
totalApplies: number;
totalAccepts: number;
totalRejects: number;
totalTabsShown: number;
totalTabsAccepted: number;
composerRequests: number;
chatRequests: number;
agentRequests: number;
cmdkUsages: number;
subscriptionIncludedReqs: number;
apiKeyReqs: number;
usageBasedReqs: number;
bugbotUsages: number;
mostUsedModel: string;
applyMostUsedExtension?: string;
tabMostUsedExtension?: string;
clientVersion?: string;
email?: string;
}[];
period: {
startDate: number;
endDate: number;
};
}
Campo | Descrição |
---|
date | Data em milissegundos desde a época (epoch) |
isActive | Usuário ativo nesse dia |
totalLinesAdded | Linhas de código adicionadas |
totalLinesDeleted | Linhas de código removidas |
acceptedLinesAdded | Linhas adicionadas a partir de sugestões de IA aceitas |
acceptedLinesDeleted | Linhas removidas a partir de sugestões de IA aceitas |
totalApplies | Operações de apply |
totalAccepts | Sugestões aceitas |
totalRejects | Sugestões rejeitadas |
totalTabsShown | Completações de tab exibidas |
totalTabsAccepted | Completações de tab aceitas |
composerRequests | Requisições do Composer |
chatRequests | Requisições de Chat |
agentRequests | Requisições do Agent |
cmdkUsages | Usos da paleta de comandos (Cmd+K) |
subscriptionIncludedReqs | Requisições incluídas na assinatura |
apiKeyReqs | Requisições com chave de API |
usageBasedReqs | Requisições pagas por uso |
bugbotUsages | Usos do detector de bugs |
mostUsedModel | Modelo de IA mais usado |
applyMostUsedExtension | Extensão de arquivo mais usada em applies |
tabMostUsedExtension | Extensão de arquivo mais usada em tabs |
clientVersion | Versão do Cursor |
email | E-mail do usuário |
{
"data": [
{
"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-4",
"applyMostUsedExtension": ".tsx",
"tabMostUsedExtension": ".ts",
"clientVersion": "0.25.1",
"email": "developer@company.com"
},
{
"date": 1710806400000,
"isActive": true,
"totalLinesAdded": 2104,
"totalLinesDeleted": 1203,
"acceptedLinesAdded": 1876,
"acceptedLinesDeleted": 987,
"totalApplies": 102,
"totalAccepts": 91,
"totalRejects": 11,
"totalTabsShown": 456,
"totalTabsAccepted": 398,
"composerRequests": 67,
"chatRequests": 156,
"agentRequests": 23,
"cmdkUsages": 89,
"subscriptionIncludedReqs": 320,
"apiKeyReqs": 15,
"usageBasedReqs": 0,
"bugbotUsages": 5,
"mostUsedModel": "claude-3-opus",
"applyMostUsedExtension": ".py",
"tabMostUsedExtension": ".py",
"clientVersion": "0.25.1",
"email": "developer@company.com"
}
],
"period": {
"startDate": 1710720000000,
"endDate": 1710892800000
}
}
curl -X POST https://api.cursor.com/teams/daily-usage-data \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000
}'
Recupera as informações de gastos do mês atual, com suporte a busca, ordenação e paginação.
Parâmetro | Tipo | Obrigatório | Descrição |
---|
searchTerm | string | Não | Pesquisa em nomes de usuário e e-mails |
sortBy | string | Não | Ordenar por: amount , date , user . Padrão: date |
sortDirection | string | Não | Direção da ordenação: asc , desc . Padrão: desc |
page | number | Não | Número da página (baseado em 1). Padrão: 1 |
pageSize | number | Não | Resultados por página |
{
teamMemberSpend: {
spendCents: number;
fastPremiumRequests: number;
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
hardLimitOverrideDollars: number;
}[];
subscriptionCycleStart: number;
totalMembers: number;
totalPages: number;
}
Campo | Descrição |
---|
spendCents | Gasto total em centavos |
fastPremiumRequests | Solicitações do modelo premium rápido |
name | Nome do membro |
email | E-mail do membro |
role | Papel na equipe |
hardLimitOverrideDollars | Substituição personalizada do limite de gastos |
subscriptionCycleStart | Início do ciclo de assinatura (epoch em milissegundos) |
totalMembers | Total de membros da equipe |
totalPages | Total de páginas |
{
"teamMemberSpend": [
{
"spendCents": 2450,
"fastPremiumRequests": 1250,
"name": "Alex",
"email": "developer@company.com",
"role": "member",
"hardLimitOverrideDollars": 100
},
{
"spendCents": 1875,
"fastPremiumRequests": 980,
"name": "Sam",
"email": "admin@company.com",
"role": "owner",
"hardLimitOverrideDollars": 0
}
],
"subscriptionCycleStart": 1708992000000,
"totalMembers": 15,
"totalPages": 1
}
Dados básicos de uso/gastos:
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Buscar um usuário específico com paginação:
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"searchTerm": "alex@company.com",
"page": 2,
"pageSize": 25
}'
Obter dados de eventos de uso
Recupera eventos de uso detalhados da tua equipe, com opções abrangentes de filtragem, pesquisa e paginação. Este endpoint fornece insights granulares sobre chamadas individuais da API, uso de modelos, consumo de tokens e custos.
POST /teams/filtered-usage-events
Parâmetro | Tipo | Obrigatório | Descrição |
---|
startDate | number | Não | Data de início em milissegundos desde a época (epoch) |
endDate | number | Não | Data de término em milissegundos desde a época (epoch) |
userId | number | Não | Filtra por ID específico de usuário |
page | number | Não | Número da página (baseado em 1). Padrão: 1 |
pageSize | number | Não | Número de resultados por página. Padrão: 10 |
email | string | Não | Filtra por e-mail do usuário |
{
totalUsageEventsCount: number;
pagination: {
numPages: number;
currentPage: number;
pageSize: number;
hasNextPage: boolean;
hasPreviousPage: boolean;
};
usageEvents: {
timestamp: string;
model: string;
kind: string;
maxMode: boolean;
requestsCosts: number;
isTokenBasedCall: boolean;
tokenUsage?: {
inputTokens: number;
outputTokens: number;
cacheWriteTokens: number;
cacheReadTokens: number;
totalCents: number;
};
isFreeBugbot: boolean;
userEmail: string;
}[];
period: {
startDate: number;
endDate: number;
};
}
Explicação dos Campos da Resposta
Field | Description |
---|
totalUsageEventsCount | Número total de eventos de uso que correspondem à consulta |
pagination | Metadados de paginação para navegar pelos resultados |
timestamp | Timestamp do evento em milissegundos desde a epoch |
model | Modelo de IA usado na requisição |
kind | Categoria de uso (ex.: “Usage-based”, “Included in Business”) |
maxMode | Indica se o modo máximo estava ativado |
requestsCosts | Custo em unidades de requisição |
isTokenBasedCall | True quando o evento é cobrado como uso baseado em tokens |
tokenUsage | Consumo detalhado de tokens (disponível quando isTokenBasedCall é true) |
isFreeBugbot | Indica se foi um uso gratuito do bugbot |
userEmail | E-mail do usuário que fez a requisição |
period | Intervalo de datas dos dados consultados |
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 12,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"model": "claude-4-opus",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 5,
"isTokenBasedCall": true,
"tokenUsage": {
"inputTokens": 126,
"outputTokens": 450,
"cacheWriteTokens": 6112,
"cacheReadTokens": 11964,
"totalCents": 20.18232
},
"isFreeBugbot": false,
"userEmail": "developer@company.com"
},
{
"timestamp": "1750979173824",
"model": "claude-4-opus",
"kind": "Usage-based",
"maxMode": true,
"requestsCosts": 10,
"isTokenBasedCall": true,
"tokenUsage": {
"inputTokens": 5805,
"outputTokens": 311,
"cacheWriteTokens": 11964,
"cacheReadTokens": 0,
"totalCents": 40.16699999999999
},
"isFreeBugbot": false,
"userEmail": "developer@company.com"
},
{
"timestamp": "1750978339901",
"model": "claude-4-sonnet-thinking",
"kind": "Included in Business",
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
Buscar todos os eventos de uso com paginação padrão:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Filtrar por intervalo de datas e usuário específico:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
Buscar eventos de uso de um usuário específico com paginação personalizada:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userId": 12345,
"page": 2,
"pageSize": 50
}'
Definir limite de gasto por usuário
Define limites de gasto para membros individuais da equipe. Isso permite controlar quanto cada usuário pode gastar com uso de IA na tua equipe.
POST /teams/user-spend-limit
Limite de taxa: 60 solicitações por minuto por equipe
Parâmetro | Tipo | Obrigatório | Descrição |
---|
userEmail | string | Sim | Endereço de e-mail do membro da equipe |
spendLimitDollars | number | Sim | Limite de gastos em dólares (apenas números inteiros, sem decimais). |
- O usuário já precisa ser membro da sua equipe
- Apenas valores inteiros são aceitos (sem valores decimais)
- Definir
spendLimitDollars
como 0 define o limite como US$ 0
Retorna uma resposta padronizada indicando sucesso ou erro:
{
outcome: 'success' | 'error';
message: string;
}
Limite definido com sucesso:
{
"outcome": "success",
"message": "Limite de gastos definido como $100 para o usuário developer@company.com"
}
Resposta de erro:
{
"outcome": "error",
"message": "Formato de e-mail inválido"
}
Definir um limite de gastos:
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
API de listas de bloqueio de repositórios
Adiciona repositórios e define padrões para impedir que arquivos ou diretórios sejam indexados ou usados como contexto pela tua equipe.
Obter blocklists de repositórios da equipe
Recupera todas as blocklists de repositórios configuradas para tua equipe.
GET /settings/repo-blocklists/repos
Resposta
Retorna um array de objetos de blocklist de repositórios:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Exemplo de resposta
{
"repos": [
{
"id": "repo_123",
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"id": "repo_456",
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}
Exemplo de solicitação
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u YOUR_API_KEY:
Fazer upsert de blocklists de repositório
Substitui as blocklists de repositório existentes para os repositórios fornecidos.
Observação: este endpoint só vai sobrescrever os padrões dos repositórios fornecidos. Todos os outros repositórios não serão afetados.
POST /settings/repo-blocklists/repos/upsert
Corpo da requisição
Parâmetro | Tipo | Obrigatório | Descrição |
---|
repos | array | Sim | Array de objetos de lista de bloqueio de repositórios |
Cada objeto de repositório deve conter:
Campo | Tipo | Obrigatório | Descrição |
---|
url | string | Sim | URL do repositório a ser bloqueado (na lista de bloqueio) |
patterns | string[] | Sim | Array de padrões de arquivos a bloquear (suporta padrões glob) |
Resposta
Retorna a lista atualizada de listas de bloqueio de repositório:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Exemplo de requisição
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"repos": [
{
"url": "https://github.com/company/sensitive-repo",
"patterns": ["*.env", "config/*", "secrets/**"]
},
{
"url": "https://github.com/company/internal-tools",
"patterns": ["*"]
}
]
}'
Excluir bloqueio de repositório
Remove um repositório específico da lista de bloqueio.
DELETE /settings/repo-blocklists/repos/:repoId
Parâmetros
Parâmetro | Tipo | Obrigatório | Descrição |
---|
repoId | string | Sim | ID da lista de bloqueio do repositório a ser excluída |
Resposta
Retorna 204 No Content quando a exclusão é bem-sucedida.
Exemplo de requisição
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_API_KEY:
Padrões comuns de blocklist:
*
- Bloquear o repositório inteiro
*.env
- Bloquear todos os arquivos .env
config/*
- Bloquear todos os arquivos no diretório config
**/*.secret
- Bloquear todos os arquivos .secret em qualquer subdiretório
src/api/keys.ts
- Bloquear um arquivo específico