Admin API bikin lo bisa ngeakses data tim lo secara terprogram, termasuk info member, metrik penggunaan, dan detail pengeluaran. Bangun dashboard kustom, alat monitoring, atau integrasiin ke workflow yang udah ada.
API ini baru rilis pertama. Kita lagi nambahin kapabilitas berdasarkan feedback — kasih tahu kita endpoint apa yang lo butuhin!
Semua permintaan API memerlukan autentikasi menggunakan kunci API. Hanya admin tim yang bisa membuat dan mengelola kunci API.
Kunci API terikat ke organisasi, dapat dilihat oleh semua admin, dan tidak terpengaruh oleh status akun pembuatnya.
- Buka cursor.com/dashboard → tab Settings → Cursor Admin API Keys
- Klik Create New API Key
- Kasih nama yang deskriptif buat key lo (misalnya, “Usage Dashboard Integration”)
- Segera salin key yang dihasilkan — lo nggak bakal bisa lihat itu lagi
Format: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Pakai API key lo sebagai username di basic authentication:
Pakai curl dengan basic auth:
curl https://api.cursor.com/{route} -u API_KEY:
Atau atur header Authorization secara langsung:
Authorization: Basic {base64_encode('API_KEY:')}
Semua endpoint API menggunakan:
Mengambil semua anggota tim beserta detailnya.
Mengembalikan array objek anggota tim:
{
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 API_KEY_KAMU:
Dapatkan Data Penggunaan Harian
Ambil metrik penggunaan harian yang detail buat tim lo dalam rentang tanggal tertentu. Ngasih insight tentang pengeditan kode, penggunaan bantuan AI, dan tingkat penerimaan.
POST /teams/daily-usage-data
Parameter | Type | Required | Description |
---|
startDate | number | Yes | Tanggal mulai dalam milidetik epoch |
endDate | number | Yes | Tanggal akhir dalam milidetik epoch |
Rentang tanggal nggak boleh lebih dari 90 hari. Buat beberapa request untuk periode yang lebih panjang.
{
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 | Tanggal dalam milidetik epoch |
isActive | Pengguna aktif pada hari tersebut |
totalLinesAdded | Jumlah baris kode yang ditambahkan |
totalLinesDeleted | Jumlah baris kode yang dihapus |
acceptedLinesAdded | Jumlah baris dari saran AI yang diterima dan ditambahkan |
acceptedLinesDeleted | Jumlah baris dari saran AI yang diterima dan dihapus |
totalApplies | Operasi apply |
totalAccepts | Saran yang diterima |
totalRejects | Saran yang ditolak |
totalTabsShown | Tab completion yang ditampilkan |
totalTabsAccepted | Tab completion yang diterima |
composerRequests | Permintaan Composer |
chatRequests | Permintaan Chat |
agentRequests | Permintaan Agent |
cmdkUsages | Penggunaan Command Palette (Cmd+K) |
subscriptionIncludedReqs | Permintaan yang termasuk dalam langganan |
apiKeyReqs | Permintaan API key |
usageBasedReqs | Permintaan bayar per penggunaan |
bugbotUsages | Penggunaan deteksi bug |
mostUsedModel | Model AI yang paling sering digunakan |
applyMostUsedExtension | Ekstensi file yang paling sering digunakan untuk apply |
tabMostUsedExtension | Ekstensi file yang paling sering digunakan untuk tab |
clientVersion | Versi Cursor |
email | Email pengguna |
{
"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 API_KEY_KAMU: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000
}'
Dapatkan Data Pengeluaran
Ambil data pengeluaran untuk bulan kalender berjalan, lengkap dengan pencarian, penyortiran, dan pagination.
Parameter | Type | Required | Description |
---|
searchTerm | string | No | Cari di nama dan email pengguna |
sortBy | string | No | Urutkan menurut: amount , date , user . Default: date |
sortDirection | string | No | Arah pengurutan: asc , desc . Default: desc |
page | number | No | Nomor halaman (indeks mulai 1). Default: 1 |
pageSize | number | No | Jumlah hasil per halaman |
{
teamMemberSpend: {
spendCents: number;
fastPremiumRequests: number;
name: string;
email: string;
role: 'owner' | 'member' | 'free-owner';
hardLimitOverrideDollars: number;
}[];
subscriptionCycleStart: number;
totalMembers: number;
totalPages: number;
}
Field | Description |
---|
spendCents | Total pengeluaran dalam sen |
fastPremiumRequests | Permintaan model premium cepat |
name | Nama anggota |
email | Email anggota |
role | Peran dalam tim |
hardLimitOverrideDollars | Penggantian batas pengeluaran kustom |
subscriptionCycleStart | Mulai siklus langganan (milidetik epoch) |
totalMembers | Total anggota tim |
totalPages | Total halaman |
{
"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
}
Data pengeluaran dasar:
curl -X POST https://api.cursor.com/teams/spend \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Cari pengguna tertentu dengan paginasi:
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
}'
Dapatkan Data Event Penggunaan
Ambil data event penggunaan yang detail untuk tim lo, dengan opsi filter, pencarian, dan paginasi yang lengkap. Endpoint ini ngasih insight granular tentang panggilan API per request, penggunaan model, konsumsi token, dan biaya.
POST /teams/filtered-usage-events
Parameter | Tipe | Wajib | Deskripsi |
---|
startDate | number | Tidak | Tanggal mulai dalam milidetik epoch |
endDate | number | Tidak | Tanggal akhir dalam milidetik epoch |
userId | number | Tidak | Filter berdasarkan ID pengguna tertentu |
page | number | Tidak | Nomor halaman (diindeks dari 1). Default: 1 |
pageSize | number | Tidak | Jumlah hasil per halaman. Default: 10 |
email | string | Tidak | Filter berdasarkan alamat email pengguna |
{
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;
};
}
Field | Description |
---|
totalUsageEventsCount | Jumlah total event penggunaan yang sesuai dengan query |
pagination | Metadata paginasi untuk menavigasi hasil |
timestamp | Stempel waktu event dalam epoch millisecond |
model | Model AI yang dipakai untuk request |
kind | Kategori penggunaan (mis., “Usage-based”, “Included in Business”) |
maxMode | Apakah max mode diaktifkan |
requestsCosts | Biaya dalam unit request |
isTokenBasedCall | True saat event ditagihkan sebagai event berbasis penggunaan |
tokenUsage | Rincian konsumsi token (tersedia saat isTokenBasedCall bernilai true) |
isFreeBugbot | Apakah ini penggunaan bugbot gratis |
userEmail | Email user yang membuat request |
period | Rentang tanggal dari data yang di-query |
{
"totalUsageEventsCount": 113,
"pagination": {
"numPages": 12,
"currentPage": 1,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false
},
"usageEvents": [
{
"timestamp": "1750979225854",
"model": "claude-4-opus",
"kind": "Berbasis penggunaan",
"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": "Termasuk dalam Paket Business"
"maxMode": true,
"requestsCosts": 1.4,
"isTokenBasedCall": false,
"isFreeBugbot": false,
"userEmail": "admin@company.com"
}
],
"period": {
"startDate": 1748411762359,
"endDate": 1751003762359
}
}
Ambil semua peristiwa penggunaan dengan paginasi default:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{}'
Filter berdasarkan rentang tanggal dan pengguna tertentu:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
-u API_KEY_KAMU: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1748411762359,
"endDate": 1751003762359,
"email": "developer@company.com",
"page": 1,
"pageSize": 25
}'
Ambil event penggunaan untuk user tertentu dengan paginasi kustom:
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
}'
Set Batas Pengeluaran Pengguna
Atur batas pengeluaran buat tiap anggota tim. Ini bikin lo bisa ngatur seberapa banyak tiap user boleh ngehabisin buat penggunaan AI di tim lo.
POST /teams/batas-pengeluaran-user
Batas laju: 60 permintaan per menit per tim
Parameter | Type | Required | Description |
---|
userEmail | string | Yes | Alamat email anggota tim |
spendLimitDollars | number | Yes | Batas pengeluaran dalam dolar (hanya bilangan bulat, tanpa desimal). |
- Pengguna harus sudah menjadi anggota tim kamu
- Hanya nilai bilangan bulat yang diterima (tanpa angka desimal)
- Mengatur
spendLimitDollars
ke 0 akan menetapkan batas menjadi $0
Mengembalikan respons standar yang menunjukkan apakah operasi berhasil atau gagal:
{
outcome: 'sukses' | 'error';
message: string;
}
Berhasil mengatur batas:
{
"outcome": "sukses",
"message": "Batas pengeluaran ditetapkan menjadi $100 untuk pengguna developer@company.com"
}
Respons kesalahan:
{
"outcome": "error",
"message": "Format email tidak valid"
}
Atur batas pengeluaran:
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
}'
Tambahkan repositori dan terapkan pola untuk mencegah file atau direktori diindeks atau digunakan sebagai konteks buat tim.
Dapatkan Blocklist Repo Tim
Ambil semua blocklist repository yang dikonfigurasi untuk tim lo.
GET /settings/repo-blocklists/repos
Respons
Mengembalikan array objek daftar blokir repositori:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Contoh Tanggapan
{
"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": ["*"]
}
]
}
Contoh Permintaan
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
-u API_KEY_KAMU:
Ganti blocklist repo yang sudah ada untuk repo yang diberikan.
Catatan: Endpoint ini cuma bakal menimpa pola untuk repo yang diberikan. Repo lainnya nggak akan terpengaruh.
POST /settings/repo-blocklists/repos/upsert
Request Body
Parameter | Type | Required | Description |
---|
repos | array | Yes | Array objek blocklist repository |
Setiap objek repository harus berisi:
Field | Type | Required | Description |
---|
url | string | Yes | URL repository untuk dimasukkan ke blocklist |
patterns | string[] | Yes | Array pola file yang akan diblokir (mendukung pola glob) |
Respons
Mengembalikan daftar blocklist repositori yang diperbarui:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Contoh Permintaan
curl -X POST https://api.cursor.com/settings/repo-blocklists/repos/upsert \
-u API_KEY_KAMU: \
-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": ["*"]
}
]
}'
Hapus repositori tertentu dari daftar blokir.
DELETE /settings/repo-blocklists/repos/:repoId
Parameter
Parameter | Tipe | Wajib | Deskripsi |
---|
repoId | string | Ya | ID blocklist repositori yang akan dihapus |
Respons
Mengembalikan 204 No Content ketika penghapusan berhasil.
Contoh Permintaan
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u KUNCI_API_LO:
Pola blocklist yang umum:
*
- Blokir seluruh repository
*.env
- Blokir semua file .env
config/*
- Blokir semua file di direktori config
**/*.secret
- Blokir semua file .secret di subdirektori mana pun
src/api/keys.ts
- Blokir file tertentu