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 sua primeira versão. Estamos expandindo as capacidades com base no feedback — diz pra gente quais endpoints tu precisa!
Todas as requisições à API exigem autenticação com uma chave de API. Só admins da equipe podem criar e gerenciar chaves de API.
As chaves de API são vinculadas à organização, visíveis para todos os admins e não são afetadas pelo status da conta do criador original.
- Navega até cursor.com/dashboard → guia 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 imediatamente — ela não vai aparecer de novo
Formato: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Usa tua API key como o username na autenticação básica:
Usando curl com autenticação básica:
curl https://api.cursor.com/{route} -u CHAVE_DE_API:
Ou define o cabeçalho Authorization diretamente:
Authorization: Basic {base64_encode('CHAVE_DA_API:')}
Todos os endpoints da API utilizam:
Recupera todos os membros do time 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": "membro"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "dono"
}
]
}
curl -X GET https://api.cursor.com/teams/members \
-u SUA_API_KEY:
Obter dados de uso diário
Recupera métricas detalhadas de uso diário da tua equipe em um intervalo de datas. Fornece 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;
};
}
Field | Description |
---|
date | Data em milissegundos de é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 | Solicitações do Composer |
chatRequests | Solicitações de chat |
agentRequests | Solicitações do agent |
cmdkUsages | Usos da paleta de comandos (Cmd+K) |
subscriptionIncludedReqs | Solicitações incluídas na assinatura |
apiKeyReqs | Solicitações com chave de API |
usageBasedReqs | Solicitações por uso (pay-per-use) |
bugbotUsages | Usos do detector de bugs |
mostUsedModel | Modelo de IA mais usado |
applyMostUsedExtension | Extensão de arquivo mais usada para applies |
tabMostUsedExtension | Extensão de arquivo mais usada para 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,
"modeloMaisUsado": "gpt-4",
"applyMostUsedExtension": ".tsx",
"tabMostUsedExtension": ".ts",
"versaoDoCliente": "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,
"modeloMaisUsado": "claude-3-opus",
"applyMostUsedExtension": ".py",
"tabMostUsedExtension": ".py",
"versaoDoCliente": "0.25.1",
"email": "developer@company.com"
}
],
"period": {
"startDate": 1710720000000,
"endDate": 1710892800000
}
}
curl -X POST https://api.cursor.com/teams/daily-usage-data \
-u SUA_CHAVE_DE_API: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000
}'
Recupera os dados de gastos do mês corrente, com suporte a busca, ordenação e paginação.
Parâmetro | Tipo | Obrigatório | Descrição |
---|
searchTerm | string | Não | Busca em nomes de usuário e emails |
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 (indexado a partir de 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 para o modelo premium rápido |
name | Nome do membro |
email | E-mail do membro |
role | Função na equipe |
hardLimitOverrideDollars | Substituição do limite de gasto (personalizado) |
subscriptionCycleStart | Início do ciclo da 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 despesas:
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 pro teu time, com opções completas de filtragem, busca e paginação. Este endpoint fornece insights granulares sobre chamadas individuais de 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 | Filtrar por ID de usuário específico |
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 | Filtrar 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 de Resposta
Campo | Descrição |
---|
totalUsageEventsCount | Número total de eventos de uso que atendem à consulta |
pagination | Metadados de paginação para navegar pelos resultados |
timestamp | Timestamp do evento em milissegundos desde a época (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 habilitado |
requestsCosts | Custo em unidades de requisição |
isTokenBasedCall | True quando o evento é cobrado como baseado em uso |
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": "Cobrado por uso",
"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": "Incluído no plano Business"
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
Obter 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 período e usuário específico:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u SUA_CHAVE_DA_API: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
Obtenha 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 gastos por usuário
Define limites de gastos para membros específicos da equipe. Isso permite controlar quanto cada usuário pode gastar com o uso de IA na tua equipe.
POST /teams/user-spend-limit
Limite de taxa: 60 requisiçõ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:
{
resultado: 'sucesso' | 'erro';
mensagem: string;
}
Limite definido com sucesso:
{
"outcome": "success",
"message": "Limite de gastos definido em US$ 100 para o usuário developer@company.com"
}
Resposta de erro:
{
"outcome": "error",
"message": "Formato de email inválido"
}
Definir 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 usa padrões para impedir que arquivos ou diretórios sejam indexados ou usados como contexto pela tua equipe.
Obter listas de bloqueio de repositórios da equipe
Recupera todas as listas de bloqueio de repositórios configuradas para tua equipe.
GET /settings/repo-blocklists/repos
Resposta
Retorna um array de objetos de lista de bloqueio de repositório:
{
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 SUA_CHAVE_DE_API:
Fazer upsert de blocklists de repositório
Substitui as blocklists de repositório existentes para os repositórios fornecidos.
Observação: este endpoint vai sobrescrever apenas 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ório |
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 |
patterns | string[] | Sim | Array de padrões de arquivo a bloquear (suporta padrões glob) |
Resposta
Retorna a lista atualizada de bloqueios de repositório:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Exemplo de solicitação
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u SUA_CHAVE_DE_API: \
-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 blocklist de repositório
Remove um repositório específico da blocklist.
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 após a exclusão bem-sucedida.
Exemplo de solicitação
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u SUA_CHAVE_DA_API:
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