Admin API ngebantu kamu ngakses data tim secara terprogram, termasuk info anggota, metrik penggunaan, dan detail pengeluaran. Bangun dashboard kustom, tool monitoring, atau integrasiin ke alur kerja yang udah ada.
API ini masih rilis pertama. Kami bakal nambah kapabilitas berdasarkan feedback — kasih tahu kami endpoint apa yang kamu butuhin!
Semua request API harus diautentikasi menggunakan API key. Hanya admin tim yang bisa membuat dan mengelola API key.
API key terikat ke organisasi, bisa dilihat oleh semua admin, dan nggak terpengaruh status akun pembuat aslinya.
- Buka cursor.com/dashboard → tab Settings → Cursor Admin API Keys
- Klik Create New API Key
- Kasih nama yang jelas/deskriptif untuk key-mu (misalnya, “Usage Dashboard Integration”)
- Salin key yang baru dibuat sekarang juga—kamu nggak akan bisa lihatnya lagi
Format: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Gunakan API key kamu sebagai username dalam basic authentication:
Menggunakan curl dengan basic auth:
curl https://api.cursor.com/{route} -u API_KEY:
Atau tetapkan header Authorization secara langsung:
Authorization: Basic {base64_encode('API_KEY:')}
Semua endpoint API menggunakan:
Ambil semua anggota tim beserta detailnya.
Mengembalikan array berisi 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 YOUR_API_KEY:
Dapatkan Data Penggunaan Harian
Ambil metrik penggunaan harian yang detail buat tim lo dalam rentang tanggal. Ngasih insight soal edit kode, pemakaian 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. Kalau butuh periode yang lebih panjang, bikin beberapa request terpisah.
{
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 epoch milidetik |
isActive | Pengguna aktif pada hari tersebut |
totalLinesAdded | Baris kode ditambahkan |
totalLinesDeleted | Baris kode dihapus |
acceptedLinesAdded | Baris ditambahkan dari saran AI yang diterima |
acceptedLinesDeleted | Baris dihapus dari saran AI yang diterima |
totalApplies | Operasi apply |
totalAccepts | Saran diterima |
totalRejects | Saran ditolak |
totalTabsShown | Tab completion ditampilkan |
totalTabsAccepted | Tab completion diterima |
composerRequests | Permintaan Composer |
chatRequests | Permintaan Chat |
agentRequests | Permintaan Agent |
cmdkUsages | Penggunaan Command Palette (Cmd+K) |
subscriptionIncludedReqs | Permintaan termasuk dalam langganan |
apiKeyReqs | Permintaan kunci API |
usageBasedReqs | Permintaan berbasis pemakaian (pay-per-use) |
bugbotUsages | Penggunaan pendeteksi bug |
mostUsedModel | Model AI yang paling sering dipakai |
applyMostUsedExtension | Ekstensi file paling sering dipakai untuk apply |
tabMostUsedExtension | Ekstensi file paling sering dipakai 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 YOUR_API_KEY: \
-H "Content-Type: application/json" \
-d '{
"startDate": 1710720000000,
"endDate": 1710892800000
}'
Ambil informasi pengeluaran untuk bulan kalender berjalan, dengan dukungan pencarian, pengurutan, dan paginasi.
Parameter | Tipe | Wajib | Deskripsi |
---|
searchTerm | string | Tidak | Cari di nama pengguna dan email |
sortBy | string | Tidak | Urutkan berdasarkan: amount , date , user . Bawaan: date |
sortDirection | string | Tidak | Arah pengurutan: asc , desc . Bawaan: desc |
page | number | Tidak | Nomor halaman (indeks mulai dari 1). Bawaan: 1 |
pageSize | number | Tidak | 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 | Deskripsi |
---|
spendCents | Total pengeluaran dalam sen |
fastPremiumRequests | Permintaan ke model premium cepat |
name | Nama anggota |
email | Email anggota |
role | Peran dalam tim |
hardLimitOverrideDollars | Penimpaan batas pengeluaran kustom |
subscriptionCycleStart | Awal siklus langganan (epoch dalam milidetik) |
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 Usage Events
Ambil usage events terperinci untuk tim lo dengan opsi filter, pencarian, dan paginasi yang lengkap. Endpoint ini kasih insight yang granular tentang panggilan API individual, penggunaan model, konsumsi token, dan biaya.
POST /teams/filtered-usage-events
Parameter | Type | Required | Description |
---|
startDate | number | No | Tanggal mulai dalam milidetik epoch |
endDate | number | No | Tanggal akhir dalam milidetik epoch |
userId | number | No | Filter berdasarkan ID user tertentu |
page | number | No | Nomor halaman (indeks mulai dari 1). Default: 1 |
pageSize | number | No | Jumlah hasil per halaman. Default: 10 |
email | string | No | Filter berdasarkan alamat email user |
{
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 kueri |
pagination | Metadata paginasi untuk menavigasi hasil |
timestamp | Timestamp event dalam epoch milidetik |
model | Model AI yang digunakan 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": "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
}
}
Ambil semua event penggunaan dengan pagination 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 user tertentu:
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
}'
Ambil event penggunaan untuk user tertentu dengan pagination 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
}'
Atur Batas Pengeluaran Pengguna
Atur batas pengeluaran buat tiap anggota tim. Ini bikin kamu bisa ngontrol berapa banyak tiap pengguna boleh belanja buat penggunaan AI di tim kamu.
POST /teams/user-spend-limit
Rate limiting: 60 request 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)
- Menyetel
spendLimitDollars
ke 0 akan menetapkan batas menjadi $0
Mengembalikan respons standar yang menunjukkan sukses atau gagal:
{
outcome: 'success' | 'error';
message: string;
}
Berhasil menetapkan batas:
{
"outcome": "success",
"message": "Batas pengeluaran ditetapkan sebesar $100 untuk pengguna developer@company.com"
}
Respons kesalahan:
{
"outcome": "error",
"message": "Format email tidak valid"
}
Tetapkan 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 repo dan gunakan pola untuk mencegah file atau direktori diindeks atau dipakai sebagai konteks buat tim lo.
Dapatkan Blocklist Repo Tim
Ambil semua blocklist repository yang dikonfigurasi buat tim lo.
GET /settings/repo-blocklists/repos
Respons
Mengembalikan array objek blocklist repositori:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Contoh Respons
{
"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 YOUR_API_KEY:
Ganti blocklist repositori yang ada untuk repo yang disediakan.
Catatan: Endpoint ini hanya akan menimpa pola untuk repositori yang disediakan. Repo lainnya tidak akan terpengaruh.
POST /settings/repo-blocklists/repos/upsert
Body Permintaan
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 yang akan dimasukkan ke blocklist |
patterns | string[] | Yes | Array pola file yang akan diblokir (mendukung pola glob) |
Respons
Mengembalikan daftar blocklist repositori yang telah diperbarui:
{
repos: {
id: string;
url: string;
patterns: string[];
}[];
}
Contoh Permintaan
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": ["*"]
}
]
}'
Hapus Repo dari Blocklist
Hapus repositori tertentu dari blocklist.
DELETE /settings/repo-blocklists/repos/:repoId
Parameter
Parameter | Type | Required | Description |
---|
repoId | string | Ya | ID blocklist repository yang akan dihapus |
Respons
Mengembalikan 204 No Content jika penghapusan berhasil.
Contoh Permintaan
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
-u YOUR_API_KEY:
Pola blocklist yang umum:
*
- Blokir seluruh repositori
*.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