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!

Autentikasi

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.

Membuat API Key

  1. Buka cursor.com/dashboard → tab SettingsCursor Admin API Keys
  2. Klik Create New API Key
  3. Kasih nama yang jelas/deskriptif untuk key-mu (misalnya, “Usage Dashboard Integration”)
  4. Salin key yang baru dibuat sekarang juga—kamu nggak akan bisa lihatnya lagi
Format: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Menggunakan API key kamu

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

URL dasar

Semua endpoint API menggunakan:
https://api.cursor.com

Endpoint

Ambil Anggota Tim

Ambil semua anggota tim beserta detailnya.
GET /teams/members

Respons

Mengembalikan array berisi objek anggota tim:
{
  teamMembers: {
    name: string;
    email: string;
    role: 'owner' | 'member' | 'free-owner';
  }[];
}

Contoh Respons

{
  "teamMembers": [
    {
      "name": "Alex",
      "email": "developer@company.com",
      "role": "member"
    },
    {
      "name": "Sam",
      "email": "admin@company.com",
      "role": "owner"
    }
  ]
}

Contoh Permintaan

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

Request Body

ParameterTypeRequiredDescription
startDatenumberYesTanggal mulai dalam milidetik epoch
endDatenumberYesTanggal akhir dalam milidetik epoch
Rentang tanggal nggak boleh lebih dari 90 hari. Kalau butuh periode yang lebih panjang, bikin beberapa request terpisah.

Respons

{
  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 Respons

FieldDescription
dateTanggal dalam epoch milidetik
isActivePengguna aktif pada hari tersebut
totalLinesAddedBaris kode ditambahkan
totalLinesDeletedBaris kode dihapus
acceptedLinesAddedBaris ditambahkan dari saran AI yang diterima
acceptedLinesDeletedBaris dihapus dari saran AI yang diterima
totalAppliesOperasi apply
totalAcceptsSaran diterima
totalRejectsSaran ditolak
totalTabsShownTab completion ditampilkan
totalTabsAcceptedTab completion diterima
composerRequestsPermintaan Composer
chatRequestsPermintaan Chat
agentRequestsPermintaan Agent
cmdkUsagesPenggunaan Command Palette (Cmd+K)
subscriptionIncludedReqsPermintaan termasuk dalam langganan
apiKeyReqsPermintaan kunci API
usageBasedReqsPermintaan berbasis pemakaian (pay-per-use)
bugbotUsagesPenggunaan pendeteksi bug
mostUsedModelModel AI yang paling sering dipakai
applyMostUsedExtensionEkstensi file paling sering dipakai untuk apply
tabMostUsedExtensionEkstensi file paling sering dipakai untuk tab
clientVersionVersi Cursor
emailEmail pengguna

Contoh Respons

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

Contoh Permintaan

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 Data Pengeluaran

Ambil informasi pengeluaran untuk bulan kalender berjalan, dengan dukungan pencarian, pengurutan, dan paginasi.
POST /teams/spend

Body Permintaan

ParameterTipeWajibDeskripsi
searchTermstringTidakCari di nama pengguna dan email
sortBystringTidakUrutkan berdasarkan: amount, date, user. Bawaan: date
sortDirectionstringTidakArah pengurutan: asc, desc. Bawaan: desc
pagenumberTidakNomor halaman (indeks mulai dari 1). Bawaan: 1
pageSizenumberTidakJumlah hasil per halaman

Respons

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

Bidang Respons

FieldDeskripsi
spendCentsTotal pengeluaran dalam sen
fastPremiumRequestsPermintaan ke model premium cepat
nameNama anggota
emailEmail anggota
rolePeran dalam tim
hardLimitOverrideDollarsPenimpaan batas pengeluaran kustom
subscriptionCycleStartAwal siklus langganan (epoch dalam milidetik)
totalMembersTotal anggota tim
totalPagesTotal halaman

Contoh Respons

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

Contoh Permintaan

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

Request Body

ParameterTypeRequiredDescription
startDatenumberNoTanggal mulai dalam milidetik epoch
endDatenumberNoTanggal akhir dalam milidetik epoch
userIdnumberNoFilter berdasarkan ID user tertentu
pagenumberNoNomor halaman (indeks mulai dari 1). Default: 1
pageSizenumberNoJumlah hasil per halaman. Default: 10
emailstringNoFilter berdasarkan alamat email user

Respons

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

Penjelasan Field Respons

FieldDescription
totalUsageEventsCountJumlah total event penggunaan yang sesuai dengan kueri
paginationMetadata paginasi untuk menavigasi hasil
timestampTimestamp event dalam epoch milidetik
modelModel AI yang digunakan untuk request
kindKategori penggunaan (mis. “Usage-based”, “Included in Business”)
maxModeApakah max mode diaktifkan
requestsCostsBiaya dalam unit request
isTokenBasedCallTrue saat event ditagihkan sebagai event berbasis penggunaan
tokenUsageRincian konsumsi token (tersedia saat isTokenBasedCall bernilai true)
isFreeBugbotApakah ini penggunaan bugbot gratis
userEmailEmail user yang membuat request
periodRentang tanggal dari data yang di-query

Contoh Respons

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

Contoh Permintaan

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

Request Body

ParameterTypeRequiredDescription
userEmailstringYesAlamat email anggota tim
spendLimitDollarsnumberYesBatas 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

Respons

Mengembalikan respons standar yang menunjukkan sukses atau gagal:
{
  outcome: 'success' | 'error';
  message: string;
}

Contoh Respons

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

Contoh Permintaan

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

API Daftar Blok Repo

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:

Upsert Repo Blocklists

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
ParameterTypeRequiredDescription
reposarrayYesArray objek blocklist repository
Setiap objek repository harus berisi:
FieldTypeRequiredDescription
urlstringYesURL repository yang akan dimasukkan ke blocklist
patternsstring[]YesArray 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
ParameterTypeRequiredDescription
repoIdstringYaID 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:

Contoh Pola

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