L’API d’administration te permet d’accéder de façon programmatique aux données de ton équipe, y compris les infos membres, les métriques d’usage et le détail des dépenses. Crée des dashboards personnalisés, des outils de monitoring, ou intègre le tout à des workflows existants.
L’API en est à sa première version. On étend les capacités selon les retours — dis-nous quels endpoints tu veux !

Authentification

Toutes les requêtes API nécessitent une authentification via 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 admins, 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 immédiatement la clé générée — tu ne la verras plus ensuite
Format : key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Utiliser ta clé API

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

URL de base

Toutes les API endpoints utilisent :
https://api.cursor.com

Endpoints

Récupérer 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": "member"
    },
    {
      "name": "Sam",
      "email": "admin@company.com",
      "role": "owner"
    }
  ]
}

Exemple de requête

curl -X GET https://api.cursor.com/teams/members \
  -u YOUR_API_KEY:

Récupérer 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 insights sur les modifications du code, l’utilisation de l’assistance IA et les taux d’acceptation.
POST /teams/daily-usage-data

Corps de la requête

ParamètreTypeRequisDescription
startDatenumberOuiDate de début en millisecondes d’époque (epoch)
endDatenumberOuiDate de fin en millisecondes d’époque (epoch)
La plage 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 la réponse

ChampDescription
dateDate en millisecondes d’époque (epoch)
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 Apply
totalAcceptsSuggestions acceptées
totalRejectsSuggestions rejetées
totalTabsShownComplétions par tabulation affichées
totalTabsAcceptedComplétions par tabulation acceptées
composerRequestsRequêtes Composer
chatRequestsRequêtes Chat
agentRequestsRequêtes Agent
cmdkUsagesUtilisations de la palette de commandes (Cmd+K)
subscriptionIncludedReqsRequêtes incluses dans l’abonnement
apiKeyReqsRequêtes avec clé API
usageBasedReqsRequêtes à l’usage
bugbotUsagesUtilisations de la détection de bugs
mostUsedModelModèle IA le plus utilisé
applyMostUsedExtensionExtension de fichier la plus utilisée pour Apply
tabMostUsedExtensionExtension de fichier la plus utilisée pour Tab
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 requête

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ètreTypeRequisDescription
searchTermstringNonRecherche dans les noms et les e-mails des utilisateurs
sortBystringNonTrier par : amount, date, user. Par défaut : date
sortDirectionstringNonSens du tri : asc, desc. Par défaut : desc
pagenumberNonNuméro de page (indexée à 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 la réponse

ChampDescription
spendCentsDépenses totales en centimes
fastPremiumRequestsRequêtes vers des modèles premium rapides
nameNom du membre
emailE-mail du membre
roleRôle dans l’équipe
hardLimitOverrideDollarsDérogation personnalisée de la limite de dépense
subscriptionCycleStartDébut du cycle d’abonnement (millisecondes depuis l’époque)
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": "member",
      "hardLimitOverrideDollars": 100
    },
    {
      "spendCents": 1875,
      "fastPremiumRequests": 980,
      "name": "Sam",
      "email": "admin@company.com",
      "role": "owner",
      "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 spécifique 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
  }'

Récupérer les données d’événements d’utilisation

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

Corps de la requête

ParamètreTypeObligatoireDescription
startDatenumberNonDate de début en millisecondes d’époque (epoch)
endDatenumberNonDate de fin en millisecondes d’époque (epoch)
userIdnumberNonFiltrer par ID d’utilisateur spécifique
pagenumberNonNuméro de page (indexée à partir de 1). Valeur par défaut : 1
pageSizenumberNonNombre de résultats par page. Valeur 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;
  };
}

Champs de la réponse, expliqués

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 d’époque (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 basé sur 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 qui a fait la requête
periodPlage 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": "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
  }
}

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 période et par utilisateur :
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
  }'
Obtenir les événements d’utilisation pour un utilisateur 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
  }'

API des listes de blocage de dépôts

Ajoute des dépôts et des motifs pour empêcher que des fichiers ou des répertoires soient indexés ou utilisés comme contexte par ton équipe.

Récupérer les listes de blocage de 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 liste de blocage de dépôts :
{
  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 requête
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
  -u YOUR_API_KEY:

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 écrasera uniquement les motifs 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ètreTypeObligatoireDescription
reposarrayOuiTableau d’objets de blocage de dépôts
Chaque objet dépôt doit contenir :
ChampTypeObligatoireDescription
urlstringOuiURL du dépôt à bloquer
patternsstring[]OuiTableau de motifs de fichiers à bloquer (motifs glob pris en charge)
Réponse
Renvoie la liste mise à jour des blocages de dépôts :
{
  repos: {
    id: string;
    url: string;
    patterns: string[];
  }[];
}
Exemple de requête
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 blocage de dépôt

Retire un dépôt spécifique de la liste de blocage.
DELETE /settings/repo-blocklists/repos/:repoId
Paramètres
ParamètreTypeObligatoireDescription
repoIdstringOuiID du blocage de dépôt à supprimer
Réponse
Renvoie 204 No Content en cas de suppression réussie.
Exemple de requête
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
  -u YOUR_API_KEY:

Exemples de motifs

Motifs de blocage courants :
  • * - Bloquer l’intégralité du 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