L’API Admin te permet d’accéder par programmation aux données de ton équipe, y compris les infos membres, les métriques d’usage et les détails de dépenses. Crée des tableaux de bord personnalisés, des outils de monitoring, ou intègre-la à tes workflows existants.
L’API en est à sa première version. On étend les capacités selon les retours — dis-nous quels endpoints il te faut !

Authentification

Toutes les requêtes à l’API nécessitent une authentification au moyen d’une clé API. Seuls les administrateurs de l’équipe peuvent créer et gérer des clés API. Les clés API sont liées à l’organisation, visibles par tous les administrateurs, et ne sont pas affectées par l’état du compte du créateur initial.

Créer une clé API

  1. Va sur cursor.com/dashboard → onglet SettingsCursor Admin API Keys
  2. Clique sur Create New API Key
  3. Donne à ta clé un nom explicite (p. ex. « Usage Dashboard Integration »)
  4. Copie la clé générée tout de suite — tu ne la verras plus après
Format : key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Utiliser ta clé API

Utilise ta clé API comme nom d’utilisateur dans l’authentification basique : Utiliser curl avec une authentification basique :
curl https://api.cursor.com/{route} -u CLÉ_API:
Ou définis directement l’en-tête Authorization :
Authorization : Basic {base64_encode('API_KEY:')}

URL de base

Tous les points de terminaison de l’API utilisent :
https://api.cursor.com

Points de terminaison

Obtenir les membres de l’équipe

Récupère tous les membres de l’équipe et leurs informations.
GET /teams/members

Réponse

Renvoie un tableau d’objets représentant des membres de l’équipe :
{
  teamMembers: {
    name: string;
    email: string;
    role: 'owner' | 'member' | 'free-owner';
  }[];
}

Exemple de réponse

{
  "teamMembers": [
    {
      "name": "Alex",
      "email": "developer@company.com",
      "role": "membre"
    },
    {
      "name": "Sam",
      "email": "admin@company.com",
      "role": "propriétaire"
    }
  ]
}

Exemple de demande

curl -X GET https://api.cursor.com/teams/members \
  -u TA_CLÉ_API:

Obtenir les données d’utilisation quotidiennes

Récupère des métriques d’utilisation quotidiennes détaillées pour ton équipe sur une plage de dates. Fournit des informations sur les modifications de code, l’utilisation de l’assistance IA et les taux d’acceptation.
POST /teams/daily-usage-data

Corps de la requête

ParamètreTypeObligatoireDescription
startDatenumberOuiDate de début en millisecondes depuis l’époque
endDatenumberOuiDate de fin en millisecondes depuis l’époque
L’intervalle de dates ne peut pas dépasser 90 jours. Fais plusieurs requêtes pour des périodes plus longues.

Réponse

{
  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;
  };
}

Champs de réponse

ChampDescription
dateDate en millisecondes Unix
isActiveUtilisateur actif ce jour-là
totalLinesAddedLignes de code ajoutées
totalLinesDeletedLignes de code supprimées
acceptedLinesAddedLignes ajoutées à partir de suggestions IA acceptées
acceptedLinesDeletedLignes supprimées à partir de suggestions IA acceptées
totalAppliesOpérations d’application
totalAcceptsSuggestions acceptées
totalRejectsSuggestions rejetées
totalTabsShownAutocomplétions d’onglet affichées
totalTabsAcceptedAutocomplétions d’onglet acceptées
composerRequestsRequêtes du Composer
chatRequestsRequêtes de chat
agentRequestsRequêtes de l’agent
cmdkUsagesUtilisations de la palette de commandes (Cmd+K)
subscriptionIncludedReqsRequêtes incluses dans l’abonnement
apiKeyReqsRequêtes via clé API
usageBasedReqsRequêtes à l’usage
bugbotUsagesUtilisations de Bugbot
mostUsedModelModèle d’IA le plus utilisé
applyMostUsedExtensionExtension de fichier la plus utilisée pour les apply
tabMostUsedExtensionExtension de fichier la plus utilisée pour les tabs
clientVersionVersion de Cursor
emailE-mail de l’utilisateur

Exemple de réponse

{
  "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
  }
}

Exemple de demande

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
  }'

Récupérer les données de dépenses

Récupère les informations de dépenses pour le mois calendaire en cours, avec recherche, tri et pagination.
POST /teams/spend

Corps de la requête

ParamètreTypeObligatoireDescription
searchTermstringNonRecherche dans les noms d’utilisateur et les e-mails
sortBystringNonTrier par : amount, date, user. Par défaut : date
sortDirectionstringNonOrdre de tri : asc, desc. Par défaut : desc
pagenumberNonNuméro de page (indexé à partir de 1). Par défaut : 1
pageSizenumberNonRésultats par page

Réponse

{
  teamMemberSpend: {
    spendCents: number;
    fastPremiumRequests: number;
    name: string;
    email: string;
    role: 'owner' | 'member' | 'free-owner';
    hardLimitOverrideDollars: number;
  }[];
  subscriptionCycleStart: number;
  totalMembers: number;
  totalPages: number;
}

Champs de réponse

ChampDescription
spendCentsDépense totale en centimes
fastPremiumRequestsRequêtes du modèle premium rapide
nameNom du membre
emailE-mail du membre
roleRôle dans l’équipe
hardLimitOverrideDollarsDérogation personnalisée à la limite de dépense
subscriptionCycleStartDébut du cycle d’abonnement (millisecondes epoch)
totalMembersNombre total de membres de l’équipe
totalPagesNombre total de pages

Exemple de réponse

{
  "teamMemberSpend": [
    {
      "spendCents": 2450,
      "fastPremiumRequests": 1250,
      "name": "Alex",
      "email": "developer@company.com",
      "role": "membre",
      "hardLimitOverrideDollars": 100
    },
    {
      "spendCents": 1875,
      "fastPremiumRequests": 980,
      "name": "Sam",
      "email": "admin@company.com",
      "role": "propriétaire",
      "hardLimitOverrideDollars": 0
    },
  ],
  "subscriptionCycleStart": 1708992000000,
  "totalMembers": 15,
  "totalPages": 1
}

Exemples de requêtes

Données de dépenses de base :
curl -X POST https://api.cursor.com/teams/spend \
  -u YOUR_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{}'
Rechercher un utilisateur précis avec pagination :
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
  }'

Obtenir les données d’événements d’usage

Récupère des événements d’usage détaillés pour ton équipe avec des options complètes de filtrage, de recherche et de pagination. Cet endpoint fournit des informations granulaires sur les appels API individuels, l’usage des modèles, la consommation de jetons et les coûts.
POST /teams/filtered-usage-events

Corps de la requête

ParamètreTypeRequisDescription
startDatenumberNonDate de début en millisecondes depuis l’époque (epoch)
endDatenumberNonDate de fin en millisecondes depuis l’époque (epoch)
userIdnumberNonFiltrer par ID utilisateur spécifique
pagenumberNonNuméro de page (indexé à partir de 1). Par défaut : 1
pageSizenumberNonNombre de résultats par page. Par défaut : 10
emailstringNonFiltrer par adresse e-mail de l’utilisateur

Réponse

{
  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;
  };
}

Explication des champs de réponse

ChampDescription
totalUsageEventsCountNombre total d’événements d’utilisation correspondant à la requête
paginationMétadonnées de pagination pour naviguer dans les résultats
timestampHorodatage de l’événement en millisecondes Unix (epoch)
modelModèle d’IA utilisé pour la requête
kindCatégorie d’utilisation (p. ex. « Usage-based », « Included in Business »)
maxModeIndique si le mode max était activé
requestsCostsCoût en unités de requête
isTokenBasedCalltrue lorsque l’événement est facturé comme un événement à l’usage
tokenUsageDétail de la consommation de jetons (disponible lorsque isTokenBasedCall est true)
isFreeBugbotIndique s’il s’agissait d’une utilisation gratuite de bugbot
userEmailE-mail de l’utilisateur ayant effectué la requête
periodIntervalle de dates des données interrogées

Exemple de réponse

{
  "totalUsageEventsCount": 113,
  "pagination": {
    "numPages": 12,
    "currentPage": 1,
    "pageSize": 10,
    "hasNextPage": true,
    "hasPreviousPage": false
  },
  "usageEvents": [
    {
      "timestamp": "1750979225854",
      "model": "claude-4-opus",
      "kind": "À l'usage",
      "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": "Inclus dans l’offre Business"
      "maxMode": true,
      "requestsCosts": 1.4,
      "isTokenBasedCall": false,
      "isFreeBugbot": false,
      "userEmail": "admin@company.com"
    }
  ],
  "period": {
    "startDate": 1748411762359,
    "endDate": 1751003762359
  }
}

Exemples de requêtes

Récupérer tous les événements d’utilisation avec la pagination par défaut :
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
  -u YOUR_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{}'
Filtrer par plage de dates et par utilisateur spécifique :
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
  }'
Récupérer les événements d’usage d’un utilisateur spécifique avec une pagination personnalisée :
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
  }'

Définir la limite de dépenses par utilisateur

Définis des limites de dépenses pour chaque membre de l’équipe. Ça te permet de contrôler combien chaque utilisateur peut dépenser pour l’utilisation de l’IA au sein de ton équipe.
POST /teams/user-spend-limit
Limitation du débit : 60 requêtes par minute et par équipe

Corps de la requête

ParamètreTypeObligatoireDescription
userEmailstringOuiAdresse e-mail du membre de l’équipe
spendLimitDollarsnumberOuiPlafond de dépenses en dollars (entier uniquement, pas de décimales).
  • L’utilisateur doit déjà faire partie de ton équipe
  • Seules les valeurs entières sont acceptées (aucun montant décimal)
  • Définir spendLimitDollars sur 0 fixe la limite à 0 $

Réponse

Retourne une réponse normalisée indiquant un succès ou un échec :
{
  outcome: 'success' | 'error';
  message: string;
}

Exemples de réponses

Limite définie avec succès :
{
  "outcome": "succès",
  "message": "Limite de dépenses définie à 100 $ pour l’utilisateur developer@company.com"
}
Réponse d’erreur :
{
  "outcome": "error",
  "message": "Format d’e-mail invalide"
}

Exemples de requêtes

Définir une limite de dépenses :
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 des listes de blocage de dépôts

Ajoute des dépôts et des motifs pour empêcher l’indexation de certains fichiers ou répertoires, ou leur utilisation comme contexte pour ton équipe.

Obtenir les listes de blocage des dépôts de l’équipe

Récupère toutes les listes de blocage de dépôts configurées pour ton équipe.
GET /settings/repo-blocklists/repos
Réponse
Renvoie un tableau d’objets de liste de blocage de dépôt :
{
  repos: {
    id: string;
    url: string;
    patterns: string[];
  }[];
}
Exemple de réponse
{
  "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": ["*"]
    }
  ]
}
Exemple de demande
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
  -u TA_CLE_API:

Upsert des listes de blocage de dépôts

Remplace les listes de blocage de dépôts existantes pour les dépôts fournis. Remarque : cet endpoint ne remplacera que les patterns pour les dépôts fournis. Tous les autres dépôts ne seront pas affectés.
POST /settings/repo-blocklists/repos/upsert
Corps de la requête
ParamètreTypeRequisDescription
reposarrayOuiTableau d’objets de blocklist de dépôts
Chaque objet de dépôt doit contenir :
ChampTypeRequisDescription
urlstringOuiURL du dépôt à ajouter à la blocklist
patternsstring[]OuiTableau de modèles de fichiers à bloquer (motifs glob pris en charge)
Réponse
Renvoie la liste mise à jour des blocklists de dépôts :
{
  repos: {
    id: string;
    url: string;
    patterns: string[];
  }[];
}
Exemple de demande
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": ["*"]
      }
    ]
  }'

Supprimer un dépôt de la blocklist

Supprime un dépôt spécifique de la blocklist.
DELETE /settings/repo-blocklists/repos/:repoId
Paramètres
ParamètreTypeRequisDescription
repoIdstringOuiID de la blocklist du dépôt à supprimer
Réponse
Renvoie 204 No Content en cas de suppression réussie.
Exemple de demande
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
  -u TA_CLÉ_API:

Exemples de modèles

Modèles courants de liste de blocage :
  • * - Bloquer tout le dépôt
  • *.env - Bloquer tous les fichiers .env
  • config/* - Bloquer tous les fichiers du répertoire config
  • **/*.secret - Bloquer tous les fichiers .secret dans n’importe quel sous-répertoire
  • src/api/keys.ts - Bloquer un fichier spécifique