La Admin API te permite acceder de forma programática a los datos de tu equipo, incluyendo información de miembros, métricas de uso y detalles de gastos. Creá dashboards personalizados, herramientas de monitoreo o integrá con tus workflows existentes.
La API está en su primera versión. Estamos ampliando capacidades según el feedback: ¡contanos qué endpoints necesitás!
Todas las solicitudes a la API requieren autenticación con una clave de API. Solo los administradores del equipo pueden crear y gestionar claves de API.
Las claves de API están vinculadas a la organización, son visibles para todos los administradores y no se ven afectadas por el estado de la cuenta de quien las creó originalmente.
- Ve a cursor.com/dashboard → pestaña Settings → Cursor Admin API Keys
- Haz clic en Create New API Key
- Dale a tu clave un nombre descriptivo (p. ej., “Integración del panel de uso”)
- Copia la clave generada de inmediato: no la volverás a ver
Formato: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Usa tu clave de API como nombre de usuario en la autenticación básica:
Usar curl con autenticación básica:
curl https://api.cursor.com/{route} -u API_KEY:
O bien establece directamente el encabezado Authorization:
Authorization: Basic {base64_encode('API_KEY:')}
Todos los endpoints de la API utilizan:
Obtener miembros del equipo
Obtén todos los miembros del equipo y sus detalles.
Devuelve un array de objetos de miembros del equipo:
{
teamMembers: {
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
}[];
}
{
"teamMembers": [
{
"name": "Alex",
"email": "developer@company.com",
"role": "miembro"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "dueño"
}
]
}
curl -X GET https://api.cursor.com/teams/members \
-u TU_CLAVE_API:
Obtener datos de uso diario
Obtén métricas diarias detalladas para tu equipo en un rango de fechas. Ofrece información sobre ediciones de código, uso de la IA de asistencia y tasas de aceptación.
Parámetro | Tipo | Requerido | Descripción |
---|
startDate | number | Sí | Fecha de inicio en milisegundos de época |
endDate | number | Sí | Fecha de fin en milisegundos de época |
El rango de fechas no puede superar los 90 días. Haz varias solicitudes para periodos más largos.
{
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 | Fecha en milisegundos desde la época (epoch) |
isActive | Usuario activo ese día |
totalLinesAdded | Líneas de código añadidas |
totalLinesDeleted | Líneas de código eliminadas |
acceptedLinesAdded | Líneas añadidas de sugerencias de IA aceptadas |
acceptedLinesDeleted | Líneas eliminadas de sugerencias de IA aceptadas |
totalApplies | Operaciones de apply |
totalAccepts | Sugerencias aceptadas |
totalRejects | Sugerencias rechazadas |
totalTabsShown | Autocompletados por tab mostrados |
totalTabsAccepted | Autocompletados por tab aceptados |
composerRequests | Solicitudes del Composer |
chatRequests | Solicitudes de chat |
agentRequests | Solicitudes del agente |
cmdkUsages | Usos de la paleta de comandos (Cmd+K) |
subscriptionIncludedReqs | Solicitudes incluidas en la suscripción |
apiKeyReqs | Solicitudes con clave de API |
usageBasedReqs | Solicitudes de pago por uso |
bugbotUsages | Usos del detector de bugs |
mostUsedModel | Modelo de IA más usado |
applyMostUsedExtension | Extensión de archivo más usada en applies |
tabMostUsedExtension | Extensión de archivo más usada en tabs |
clientVersion | Versión de Cursor |
email | Correo electrónico del usuario |
{
"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
}'
Obtén la información de gastos del mes calendario actual con búsqueda, ordenación y paginación.
Parámetro | Tipo | Requerido | Descripción |
---|
searchTerm | string | No | Busca en nombres de usuario y direcciones de correo |
sortBy | string | No | Ordena por: amount , date , user . Predeterminado: date |
sortDirection | string | No | Dirección de orden: asc , desc . Predeterminado: desc |
page | number | No | Número de página (indexado desde 1). Predeterminado: 1 |
pageSize | number | No | 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 | Descripción |
---|
spendCents | Gasto total en centavos |
fastPremiumRequests | Solicitudes al modelo premium rápido |
name | Nombre del miembro |
email | Correo electrónico del miembro |
role | Rol en el equipo |
hardLimitOverrideDollars | Anulación del límite de gasto personalizado |
subscriptionCycleStart | Inicio del ciclo de suscripción (milisegundos desde la época) |
totalMembers | Total de miembros del equipo |
totalPages | Total de páginas |
{
"teamMemberSpend": [
{
"spendCents": 2450,
"fastPremiumRequests": 1250,
"name": "Alex",
"email": "developer@company.com",
"role": "miembro",
"hardLimitOverrideDollars": 100
},
{
"spendCents": 1875,
"fastPremiumRequests": 980,
"name": "Sam",
"email": "admin@company.com",
"role": "propietario",
"hardLimitOverrideDollars": 0
},
],
"subscriptionCycleStart": 1708992000000,
"totalMembers": 15,
"totalPages": 1
}
Datos básicos de gastos:
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Buscar a un usuario específico con paginación:
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
}'
Obtener datos de eventos de uso
Obtén eventos de uso detallados para tu equipo con opciones completas de filtrado, búsqueda y paginación. Este endpoint ofrece información granular sobre llamadas individuales a la API, uso de modelos, consumo de tokens y costos.
POST /teams/filtered-usage-events
Parámetro | Tipo | Requerido | Descripción |
---|
startDate | number | No | Fecha de inicio en milisegundos de época (epoch) |
endDate | number | No | Fecha de fin en milisegundos de época (epoch) |
userId | number | No | Filtrar por ID de usuario específico |
page | number | No | Número de página (con índice desde 1). Predeterminado: 1 |
pageSize | number | No | Cantidad de resultados por página. Predeterminado: 10 |
email | string | No | Filtrar por correo electrónico del usuario |
{
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;
};
}
Campo | Descripción |
---|
totalUsageEventsCount | Número total de eventos de uso que coinciden con la consulta |
pagination | Metadatos de paginación para navegar los resultados |
timestamp | Marca de tiempo del evento en milisegundos desde el epoch |
model | Modelo de IA usado para la solicitud |
kind | Categoría de uso (p. ej., “Usage-based”, “Included in Business”) |
maxMode | Si el modo máximo estaba habilitado |
requestsCosts | Costo en unidades de solicitud |
isTokenBasedCall | True cuando el evento se cobra como evento basado en uso |
tokenUsage | Consumo detallado de tokens (disponible cuando isTokenBasedCall es true) |
isFreeBugbot | Si fue un uso gratuito de bugbot |
userEmail | Correo del usuario que hizo la solicitud |
period | Rango de fechas de los datos consultados |
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 12,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"model": "claude-4-opus",
"kind": "Según 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": "Según uso",
"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": "Incluido en Business"
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
Obtener todos los eventos de uso con la paginación por defecto:
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 fechas y usuario 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
}'
Obtén eventos de uso de un usuario específico con paginación 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
}'
Establecer límite de gasto por usuario
Establece límites de gasto para miembros específicos del equipo. Esto te permite controlar cuánto puede gastar cada usuario en uso de IA dentro de tu equipo.
POST /teams/user-spend-limit
Limitación de frecuencia: 60 solicitudes por minuto por equipo
Parámetro | Tipo | Obligatorio | Descripción |
---|
userEmail | string | Sí | Dirección de correo del miembro del equipo |
spendLimitDollars | number | Sí | Límite de gasto en dólares (solo números enteros, sin decimales). |
- El usuario ya debe ser miembro de tu equipo
- Solo se aceptan valores enteros (sin decimales)
- Establecer
spendLimitDollars
en 0 fija el límite en $0
Devuelve una respuesta estandarizada que indica si hubo éxito o error:
{
outcome: 'success' | 'error';
message: string;
}
Límite establecido correctamente:
{
"outcome": "success",
"message": "Límite de gasto configurado en $100 para el usuario developer@company.com"
}
Respuesta de error:
{
"outcome": "error",
"message": "Formato de correo electrónico inválido"
}
Configurar un límite de gasto:
curl -X POST https://api.cursor.com/teams/user-spend-limit \
-u TU_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"userEmail": "developer@company.com",
"spendLimitDollars": 100
}'
API de listas de bloqueo de repos
Agrega repos y usa patrones para evitar que archivos o directorios se indexen o se usen como contexto para tu equipo.
Obtener las blocklists de repos del equipo
Obtén todas las blocklists de repos configuradas para tu equipo.
GET /settings/repo-blocklists/repos
Respuesta
Devuelve un array de objetos de lista de bloqueo del repositorio:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Ejemplo de respuesta
{
"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": ["*"]
}
]
}
Ejemplo de petición
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u TU_CLAVE_API:
Upsert de listas de bloqueo de repos
Reemplaza las listas de bloqueo de repositorios existentes para los repos proporcionados.
Nota: Este endpoint solo sobrescribirá los patrones de los repositorios proporcionados. Todos los demás repos no se verán afectados.
POST /settings/repo-blocklists/repos/upsert
Cuerpo de la solicitud
Parámetro | Tipo | Requerido | Descripción |
---|
repos | array | Sí | Lista de objetos de bloqueo de repositorios |
Cada objeto de repositorio debe contener:
Campo | Tipo | Requerido | Descripción |
---|
url | string | Sí | URL del repositorio a bloquear |
patterns | string[] | Sí | Lista de patrones de archivos a bloquear (se admiten patrones glob) |
Respuesta
Devuelve la lista actualizada de listas de bloqueo del repositorio:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Ejemplo de solicitud
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u TU_CLAVE_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": ["*"]
}
]
}'
Eliminar la lista de bloqueo de repositorios
Quita un repositorio específico de la lista de bloqueo.
DELETE /settings/repo-blocklists/repos/:repoId
Parámetros
Parámetro | Tipo | Obligatorio | Descripción |
---|
repoId | string | Sí | ID de la lista de bloqueo del repositorio que se va a eliminar |
Respuesta
Devuelve 204 No Content si la eliminación se realiza correctamente.
Ejemplo de petición
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u TU_API_KEY:
Patrones comunes de la blocklist:
*
- Bloquear todo el repositorio
*.env
- Bloquear todos los archivos .env
config/*
- Bloquear todos los archivos del directorio config
**/*.secret
- Bloquear todos los archivos .secret en cualquier subdirectorio
src/api/keys.ts
- Bloquear un archivo específico