Die Admin-API ermöglicht dir den programmgesteuerten Zugriff auf die Daten deines Teams, einschließlich Mitgliederinformationen, Nutzungsmetriken und Ausgabendetails. Erstelle eigene Dashboards, Monitoring-Tools oder integriere sie in bestehende Workflows.
Die API ist in der ersten Version. Wir erweitern die Funktionen basierend auf Feedback – sag uns, welche Endpunkte du brauchst!
Alle API-Anfragen erfordern eine Authentifizierung mit einem API-Schlüssel. Nur Team-Admins können API-Schlüssel erstellen und verwalten.
API-Schlüssel sind an die Organisation gebunden, für alle Admins sichtbar und bleiben vom Kontostatus der ursprünglichen Ersteller:in unberührt.
Erstellen eines API-Schlüssels
- Navigiere zu cursor.com/dashboard → Settings-Tab → Cursor Admin API Keys
- Klicke auf Create New API Key
- Gib deinem Schlüssel einen aussagekräftigen Namen (z. B. „Usage Dashboard Integration“)
- Kopiere den generierten Schlüssel sofort – du wirst ihn später nicht mehr sehen
Format: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Verwendung deines API-Schlüssels
Verwende deinen API-Schlüssel als Benutzernamen bei der Basic-Authentifizierung:
curl mit Basic Auth verwenden:
curl https://api.cursor.com/{route} -u API_KEY:
Oder den Authorization-Header direkt setzen:
Authorization: Basic {base64_encode('API_KEY:')}
Alle API-Endpunkte verwenden:
Ruft alle Teammitglieder und ihre Details ab.
Gibt ein Array von Teammitgliedern zurück:
{
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:
Tägliche Nutzungsdaten abrufen
Hol dir detaillierte tägliche Nutzungsmetriken für dein Team in einem Datumsbereich. Liefert Einblicke in Code-Änderungen, die Nutzung der KI-Unterstützung und Akzeptanzraten.
POST /teams/daily-usage-data
Parameter | Typ | Erforderlich | Beschreibung |
---|
startDate | number | Ja | Startdatum in Millisekunden seit der Unix-Epoche |
endDate | number | Ja | Enddatum in Millisekunden seit der Unix-Epoche |
Der Datumsbereich darf 90 Tage nicht überschreiten. Für längere Zeiträume mehrere Requests senden.
{
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;
};
}
Feld | Beschreibung |
---|
date | Datum in Epoch-Millisekunden |
isActive | Nutzer an diesem Tag aktiv |
totalLinesAdded | Hinzugefügte Codezeilen |
totalLinesDeleted | Gelöschte Codezeilen |
acceptedLinesAdded | Aus akzeptierten KI-Vorschlägen hinzugefügte Zeilen |
acceptedLinesDeleted | Aus akzeptierten KI-Vorschlägen gelöschte Zeilen |
totalApplies | Apply-Operationen |
totalAccepts | Akzeptierte Vorschläge |
totalRejects | Abgelehnte Vorschläge |
totalTabsShown | Angezeigte Tab-Vervollständigungen |
totalTabsAccepted | Akzeptierte Tab-Vervollständigungen |
composerRequests | Composer-Anfragen |
chatRequests | Chat-Anfragen |
agentRequests | Agent-Anfragen |
cmdkUsages | Nutzungen der Befehlspalette (Cmd+K) |
subscriptionIncludedReqs | Im Abo enthaltene Anfragen |
apiKeyReqs | API-Schlüssel-Anfragen |
usageBasedReqs | Nutzungsbasierte Anfragen |
bugbotUsages | Nutzungen der Bug-Erkennung |
mostUsedModel | Am häufigsten verwendetes KI-Modell |
applyMostUsedExtension | Am häufigsten verwendete Dateierweiterung für Applies |
tabMostUsedExtension | Am häufigsten verwendete Dateierweiterung für Tabs |
clientVersion | Cursor-Version |
email | Nutzer-E-Mail |
{
"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
}'
Ruf Ausgaben für den aktuellen Kalendermonat mit Suche, Sortierung und Paginierung ab.
Parameter | Typ | Erforderlich | Beschreibung |
---|
searchTerm | string | Nein | Suche in Benutzernamen und E-Mail-Adressen |
sortBy | string | Nein | Sortieren nach: amount , date , user . Standard: date |
sortDirection | string | Nein | Sortierrichtung: asc , desc . Standard: desc |
page | number | Nein | Seitennummer (1-basiert). Standard: 1 |
pageSize | number | Nein | Ergebnisse pro Seite |
{
teamMemberSpend: {
spendCents: number;
fastPremiumRequests: number;
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
hardLimitOverrideDollars: number;
}[];
subscriptionCycleStart: number;
totalMembers: number;
totalPages: number;
}
Feld | Beschreibung |
---|
spendCents | Gesamtausgaben in Cent |
fastPremiumRequests | Anfragen an das schnelle Premiummodell |
name | Name des Mitglieds |
email | E‑Mail des Mitglieds |
role | Teamrolle |
hardLimitOverrideDollars | Benutzerdefinierte Überschreibung des Ausgabenlimits |
subscriptionCycleStart | Beginn des Abrechnungszyklus (Epoch-Millisekunden) |
totalMembers | Anzahl der Teammitglieder insgesamt |
totalPages | Gesamtzahl der Seiten |
{
"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
}
Basis-Ausgabendaten:
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Bestimmten Nutzer mit Pagination suchen:
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
}'
Nutzungsereignisdaten abrufen
Ruf detaillierte Nutzungsereignisse für dein Team mit umfassenden Optionen für Filter, Suche und Paginierung ab. Dieser Endpoint liefert granulare Einblicke in einzelne API-Aufrufe, Modellauslastung, Token-Verbrauch und Kosten.
POST /teams/filtered-usage-events
Parameter | Typ | Erforderlich | Beschreibung |
---|
startDate | number | Nein | Startdatum in Unix-Millisekunden |
endDate | number | Nein | Enddatum in Unix-Millisekunden |
userId | number | Nein | Nach bestimmter User-ID filtern |
page | number | Nein | Seitennummer (1-basiert). Standard: 1 |
pageSize | number | Nein | Anzahl der Ergebnisse pro Seite. Standard: 10 |
email | string | Nein | Nach User-E-Mail-Adresse filtern |
{
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;
};
}
Erklärung der Response-Felder
Field | Description |
---|
totalUsageEventsCount | Gesamtzahl der Nutzungsereignisse, die der Abfrage entsprechen |
pagination | Paginierungs-Metadaten zur Navigation in den Ergebnissen |
timestamp | Ereigniszeitstempel in Unix-Millisekunden |
model | Für die Anfrage verwendetes KI-Modell |
kind | Nutzungskategorie (z. B. „Usage-based“, „Included in Business“) |
maxMode | Ob Max Mode aktiviert war |
requestsCosts | Kosten in Request-Einheiten |
isTokenBasedCall | True, wenn das Ereignis als nutzungsbasiertes Ereignis abgerechnet wird |
tokenUsage | Detaillierte Token-Nutzung (verfügbar, wenn isTokenBasedCall true ist) |
isFreeBugbot | Ob dies eine kostenlose Bugbot-Nutzung war |
userEmail | E-Mail der Person, die die Anfrage gestellt hat |
period | Datumsbereich der abgefragten Daten |
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 12,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"model": "claude-4-opus",
"kind": "Nutzungsbasiert",
"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": "Nutzungsbasiert",
"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": "In Business enthalten",
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
Alle Nutzungsevents mit Standard-Paginierung abrufen:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Nach Datumsbereich und bestimmtem User filtern:
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
}'
Nutzungsevents für einen bestimmten User mit benutzerdefinierter Paginierung abrufen:
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
}'
Ausgabenlimit für Nutzer festlegen
Lege Ausgabenlimits für einzelne Teammitglieder fest. So kannst du steuern, wie viel jede:r Nutzer:in für die AI-Nutzung in deinem Team ausgeben kann.
POST /teams/user-spend-limit
Rate Limit: 60 Anfragen pro Minute und Team
Parameter | Typ | Erforderlich | Beschreibung |
---|
userEmail | string | Ja | E-Mail-Adresse des Teammitglieds |
spendLimitDollars | number | Ja | Ausgabenlimit in US-Dollar (nur ganze Zahlen, keine Dezimalstellen). |
- Der User muss bereits Mitglied deines Teams sein
- Es werden nur ganze Zahlen akzeptiert (keine Dezimalbeträge)
- Das Setzen von
spendLimitDollars
auf 0 setzt das Limit auf $0
Gibt eine standardisierte Antwort zurück, die Erfolg oder Fehler signalisiert:
{
outcome: 'success' | 'error';
message: string;
}
Limit erfolgreich festgelegt:
{
"outcome": "success",
"message": "Ausgabenlimit von $100 für Benutzer developer@company.com festgelegt"
}
Fehlerantwort:
{
"outcome": "error",
"message": "Ungültiges E-Mail-Format"
}
Ausgabenlimit festlegen:
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
}'
Füge Repositories und Muster hinzu, um zu verhindern, dass Dateien oder Verzeichnisse für dein Team indexiert oder als Kontext verwendet werden.
Team-Repo-Blocklists abrufen
Ruf alle Repository-Blocklists ab, die für dein Team konfiguriert sind.
GET /settings/repo-blocklists/repos
Antwort
Gibt ein Array von Repository-Blocklist-Objekten zurück:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Beispielantwort
{
"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": ["*"]
}
]
}
Beispielanfrage
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u YOUR_API_KEY:
Ersetze bestehende Repository-Blocklists für die angegebenen Repos.
Hinweis: Dieser Endpoint überschreibt nur die Patterns für die angegebenen Repositories. Alle anderen Repos bleiben unverändert.
POST /settings/repo-blocklists/repos/upsert
Request-Body
Parameter | Typ | Erforderlich | Beschreibung |
---|
repos | array | Ja | Array von Repository-Blocklist-Objekten |
Jedes Repository-Objekt muss Folgendes enthalten:
Feld | Typ | Erforderlich | Beschreibung |
---|
url | string | Ja | Repository-URL, die blocklistet werden soll |
patterns | string[] | Ja | Array von Dateimustern, die blockiert werden sollen (Glob-Patterns werden unterstützt) |
Antwort
Gibt die aktualisierte Liste der Repository-Blocklisten zurück:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Beispielanfrage
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": ["*"]
}
]
}'
Entferne ein bestimmtes Repository aus der Blocklist.
DELETE /settings/repo-blocklists/repos/:repoId
Parameter
Parameter | Typ | Erforderlich | Beschreibung |
---|
repoId | string | Ja | ID der Repository-Blockliste, die gelöscht werden soll |
Antwort
Gibt bei erfolgreichem Löschen 204 No Content zurück.
Beispielanfrage
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_API_KEY:
Häufige Blocklist-Muster:
*
- Gesamtes Repository blockieren
*.env
- Alle .env-Dateien blockieren
config/*
- Alle Dateien im Verzeichnis config blockieren
**/*.secret
- Alle .secret-Dateien in beliebigen Unterverzeichnissen blockieren
src/api/keys.ts
- Bestimmte Datei blockieren