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 gasto. Crea dashboards personalizados, herramientas de monitoreo o intégrala en tus flujos de trabajo existentes.
La API está en su primera versión. Estamos ampliando sus capacidades según el feedback: ¡cuéntanos qué endpoints necesitas!
Todas las solicitudes a la API requieren autenticación con una clave de API. Solo los administradores del equipo pueden crear y administrar 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 del creador original.
- Ve a cursor.com/dashboard → pestaña Settings → Cursor Admin API Keys
- Haz clic en Create New API Key
- Asigna a tu clave un nombre descriptivo (p. ej., “Usage Dashboard Integration”)
- 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:
Usa curl con autenticación básica:
curl https://api.cursor.com/{route} -u API_KEY:
O configura directamente el encabezado Authorization:
Authorization: Basic {base64_encode('API_KEY:')}
Todos los endpoints de la API utilizan:
Obtener miembros del equipo
Obtiene 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": "member"
},
{
"name": "Sam",
"email": "admin@company.com",
"role": "owner"
}
]
}
curl -X GET https://api.cursor.com/teams/members \
-u YOUR_API_KEY:
Obtener datos de uso diarios
Obtén métricas detalladas de uso diario para tu equipo en un rango de fechas. Ofrece información sobre ediciones de código, uso de la asistencia de IA y tasas de aceptación.
POST /teams/daily-usage-data
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;
};
}
Campo | Descripción |
---|
date | Fecha en milisegundos desde la época |
isActive | Usuario activo en este 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 de tab mostrados |
totalTabsAccepted | Autocompletados de tab aceptados |
composerRequests | Solicitudes de Composer |
chatRequests | Solicitudes de chat |
agentRequests | Solicitudes de agent |
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 de detección de bugs |
mostUsedModel | Modelo de IA más usado |
applyMostUsedExtension | Extensión de archivo más usada para apply |
tabMostUsedExtension | Extensión de archivo más usada para tab |
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 información de gastos del mes calendario actual con búsqueda, ordenación y paginación.
Parámetro | Tipo | Obligatorio | Descripción |
---|
searchTerm | string | No | Busca en nombres de usuario y correos electrónicos |
sortBy | string | No | Ordena por: amount , date , user . Predeterminado: date |
sortDirection | string | No | Dirección de ordenación: asc , desc . Predeterminado: desc |
page | number | No | Número de página (basado en 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 de modelos premium rápidos |
name | Nombre del miembro |
email | Email del miembro |
role | Rol del miembro en el equipo |
hardLimitOverrideDollars | Anulación del límite de gasto personalizado (en dólares) |
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": "member",
"hardLimitOverrideDollars": 100
},
{
"spendCents": 1875,
"fastPremiumRequests": 980,
"name": "Sam",
"email": "admin@company.com",
"role": "owner",
"hardLimitOverrideDollars": 0
}
],
"subscriptionCycleStart": 1708992000000,
"totalMembers": 15,
"totalPages": 1
}
Datos básicos de gasto:
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 desde epoch |
endDate | number | No | Fecha de fin en milisegundos desde epoch |
userId | number | No | Filtrar por ID de usuario específico |
page | number | No | Número de página (base 1). Predeterminado: 1 |
pageSize | number | No | Número de resultados por página. Predeterminado: 10 |
email | string | No | Filtrar por dirección de 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;
};
}
Campos de respuesta explicados
Field | Descripción |
---|
totalUsageEventsCount | Número total de eventos de uso que coinciden con la consulta |
pagination | Metadatos de paginación para navegar por los resultados |
timestamp | Marca de tiempo del evento en milisegundos desde época (epoch) |
model | Modelo de IA usado para la solicitud |
kind | Categoría de uso (p. ej., “Usage-based”, “Included in Business”) |
maxMode | Indica si Max Mode 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 | Indica si fue un uso gratuito de Bugbot |
userEmail | Correo electrónico 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 paginación predeterminada:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Filtrar por rango 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
}'
Obtener 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 individuales del equipo. Esto te permite controlar cuánto puede gastar cada usuario en el uso de IA dentro de tu equipo.
POST /teams/user-spend-limit
Límites de tasa: 60 solicitudes por minuto por equipo
Parámetro | Tipo | Requerido | Descripción |
---|
userEmail | string | Sí | Dirección de correo electrónico 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 establecerá el límite en $0
Devuelve una respuesta estandarizada que indica éxito o error:
{
outcome: 'success' | 'error';
message: string;
}
Límite establecido correctamente:
{
"outcome": "success",
"message": "Límite de gasto establecido en $100 para el usuario developer@company.com"
}
Respuesta de error:
{
"outcome": "error",
"message": "Formato de correo electrónico no válido"
}
Configurar un límite de gasto:
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 bloqueo de repositorios
Agrega repositorios y usa patrones para impedir que archivos o directorios se indexen o se utilicen como contexto para tu equipo.
---MDX_CONTENTEND---
Obtener las listas de bloqueo de repos del equipo
Obtén todas las listas de bloqueo de repositorios configuradas para tu equipo.
GET /settings/repo-blocklists/repos
Respuesta
Devuelve un array de objetos de lista de bloqueo de repositorios:
{
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 solicitud
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u YOUR_API_KEY:
Actualizar o insertar listas de bloqueo de repos
Reemplaza las listas de bloqueo de repos 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í | Arreglo de objetos de lista de bloqueo de repositorios |
Cada objeto de repositorio debe contener:
Campo | Tipo | Requerido | Descripción |
---|
url | string | Sí | URL del repositorio a bloquear (en la lista de bloqueo) |
patterns | string[] | Sí | Arreglo de patrones de archivos a bloquear (se admiten patrones glob) |
Respuesta
Devuelve la lista actualizada de listas de bloqueo de repositorios:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Ejemplo de solicitud
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": ["*"]
}
]
}'
Eliminar repos de la lista de bloqueo
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 cuando la eliminación se realiza correctamente.
Ejemplo de solicitud
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_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