Admin API를 사용하면 멤버 정보, 사용량 메트릭, 지출 세부 정보를 포함한 팀 데이터에 프로그래밍 방식으로 액세스할 수 있습니다. 사용자 정의 대시보드, 모니터링 도구를 구축하거나 기존 워크플로우와 통합할 수 있습니다.
API는 첫 번째 릴리스 단계입니다. 피드백을 바탕으로 기능을 확장하고 있으니 필요한 엔드포인트가 있으면 알려주세요!

인증

모든 API 요청은 API 키를 사용한 인증이 필요합니다. 팀 관리자만 API 키를 생성하고 관리할 수 있습니다. API 키는 조직에 연결되어 있으며, 모든 관리자가 볼 수 있고, 원래 생성자의 계정 상태에 영향을 받지 않습니다.

API 키 생성

  1. cursor.com/dashboardSettings 탭 → Cursor Admin API Keys로 이동
  2. Create New API Key 클릭
  3. 키에 설명적인 이름을 지정 (예: “Usage Dashboard Integration”)
  4. 생성된 키를 즉시 복사 - 다시 볼 수 없습니다
형식: key_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

API 키 사용

기본 인증에서 API 키를 사용자명으로 사용하세요: curl과 기본 인증 사용:
curl https://api.cursor.com/{route} -u API_KEY:
또는 Authorization 헤더를 직접 설정:
Authorization: Basic {base64_encode('API_KEY:')}

Base URL

모든 API 엔드포인트는 다음을 사용합니다:
https://api.cursor.com

엔드포인트

팀 멤버 조회

모든 팀 멤버와 세부 정보를 조회합니다.
GET /teams/members

응답

팀 멤버 객체 배열을 반환합니다:
{
  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:

일일 사용량 데이터 조회

날짜 범위 내에서 팀의 상세한 일일 사용량 메트릭을 조회합니다. 코드 편집, AI 지원 사용량, 수락률에 대한 인사이트를 제공합니다.
POST /teams/daily-usage-data

요청 본문

매개변수타입필수설명
startDatenumberYes시작 날짜 (에포크 밀리초)
endDatenumberYes종료 날짜 (에포크 밀리초)
날짜 범위는 90일을 초과할 수 없습니다. 더 긴 기간의 경우 여러 요청을 수행하세요.

응답

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

응답 필드

필드설명
date날짜 (에포크 밀리초)
isActive해당 날짜에 사용자가 활성 상태였는지 여부
totalLinesAdded추가된 코드 라인 수
totalLinesDeleted삭제된 코드 라인 수
acceptedLinesAdded수락된 AI 제안으로 추가된 라인 수
acceptedLinesDeleted수락된 AI 제안으로 삭제된 라인 수
totalApplies적용 작업 수
totalAccepts수락된 제안 수
totalRejects거부된 제안 수
totalTabsShown표시된 탭 완성 수
totalTabsAccepted수락된 탭 완성 수
composerRequestsComposer 요청 수
chatRequests채팅 요청 수
agentRequests에이전트 요청 수
cmdkUsages명령 팔레트 (Cmd+K) 사용 수
subscriptionIncludedReqs구독 포함 요청 수
apiKeyReqsAPI 키 요청 수
usageBasedReqs사용량 기반 요청 수
bugbotUsages버그 탐지 사용 수
mostUsedModel가장 많이 사용된 AI 모델
applyMostUsedExtension적용에서 가장 많이 사용된 파일 확장자
tabMostUsedExtension탭에서 가장 많이 사용된 파일 확장자
clientVersionCursor 버전
email사용자 이메일

응답 예시

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

지출 데이터 가져오기

검색, 정렬, 페이지네이션 기능과 함께 현재 달력 월의 지출 정보를 조회합니다.
POST /teams/spend

요청 본문

매개변수타입필수설명
searchTermstring아니오사용자 이름과 이메일에서 검색
sortBystring아니오정렬 기준: amount, date, user. 기본값: date
sortDirectionstring아니오정렬 방향: asc, desc. 기본값: desc
pagenumber아니오페이지 번호 (1부터 시작). 기본값: 1
pageSizenumber아니오페이지당 결과 수

응답

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

응답 필드

필드설명
spendCents총 지출 (센트 단위)
fastPremiumRequests빠른 프리미엄 모델 요청 수
name멤버 이름
email멤버 이메일
role팀 역할
hardLimitOverrideDollars사용자 지정 지출 한도 재정의
subscriptionCycleStart구독 주기 시작 (에포크 밀리초)
totalMembers총 팀 멤버 수
totalPages총 페이지 수

응답 예시

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

요청 예시

기본 지출 데이터:
curl -X POST https://api.cursor.com/teams/spend \
  -u YOUR_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{}'
페이지네이션을 사용한 특정 사용자 검색:
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
  }'

사용량 이벤트 데이터 가져오기

포괄적인 필터링, 검색 및 페이지네이션 옵션을 통해 팀의 상세한 사용량 이벤트를 검색합니다. 이 엔드포인트는 개별 API 호출, 모델 사용량, 토큰 소비량 및 비용에 대한 세부적인 인사이트를 제공합니다.
POST /teams/filtered-usage-events

요청 본문

매개변수타입필수설명
startDatenumber아니오에포크 밀리초 단위의 시작 날짜
endDatenumber아니오에포크 밀리초 단위의 종료 날짜
userIdnumber아니오특정 사용자 ID로 필터링
pagenumber아니오페이지 번호 (1부터 시작). 기본값: 1
pageSizenumber아니오페이지당 결과 수. 기본값: 10
emailstring아니오사용자 이메일 주소로 필터링

응답

{
  totalUsageEventsCount: number;
  pagination: {
    numPages: number;
    currentPage: number;
    pageSize: number;
    hasNextPage: boolean;
    hasPreviousPage: boolean;
  };
  usageEvents: {
    timestamp: string;
    model: string;
    kindLabel: 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;
  };
}

응답 필드 설명

필드설명
totalUsageEventsCount쿼리와 일치하는 사용량 이벤트의 총 개수
pagination결과 탐색을 위한 페이지네이션 메타데이터
timestamp에포크 밀리초 단위의 이벤트 타임스탬프
model요청에 사용된 AI 모델
kindLabel사용량 카테고리 (예: “Usage-based”, “Included in Business”)
maxMode최대 모드가 활성화되었는지 여부
requestsCosts요청 단위의 비용
isTokenBasedCall이벤트가 사용량 기반 이벤트로 청구될 때 true
tokenUsage상세한 토큰 소비량 (isTokenBasedCall이 true일 때 사용 가능)
isFreeBugbot무료 bugbot 사용인지 여부
userEmail요청을 한 사용자의 이메일
period쿼리된 데이터의 날짜 범위

응답 예시

{
  "totalUsageEventsCount": 113,
  "pagination": {
    "numPages": 12,
    "currentPage": 1,
    "pageSize": 10,
    "hasNextPage": true,
    "hasPreviousPage": false
  },
  "usageEvents": [
    {
      "timestamp": "1750979225854",
      "model": "claude-4-opus",
      "kindLabel": "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",
      "kindLabel": "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",
      "kindLabel": "Included in Business",
      "maxMode": true,
      "requestsCosts": 1.4,
      "isTokenBasedCall": false,
      "isFreeBugbot": false,
      "userEmail": "admin@company.com"
    }
  ],
  "period": {
    "startDate": 1748411762359,
    "endDate": 1751003762359
  }
}

요청 예시

기본 페이지네이션으로 모든 사용량 이벤트 가져오기:
curl -X POST https://api.cursor.com/teams/filtered-usage-events \
  -u YOUR_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{}'
날짜 범위 및 특정 사용자로 필터링:
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
  }'
사용자 지정 페이지네이션으로 특정 사용자의 사용량 이벤트 가져오기:
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
  }'

Repo Blocklists API

리포지토리와 사용 패턴을 추가하여 파일이나 디렉토리가 인덱싱되거나 팀의 컨텍스트로 사용되는 것을 방지합니다.

팀 리포지토리 차단 목록 가져오기

팀에 구성된 모든 리포지토리 차단 목록을 검색합니다.
GET /settings/repo-blocklists/repos
응답
리포지토리 차단 목록 객체의 배열을 반환합니다:
{
  repos: {
    id: string;
    url: string;
    patterns: string[];
  }[];
}
응답 예시
{
  "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": ["*"]
    }
  ]
}
요청 예시
curl -X GET https://api.cursor.com/settings/repo-blocklists/repos \
  -u YOUR_API_KEY:

리포지토리 차단 목록 업서트

제공된 리포지토리에 대한 기존 리포지토리 차단 목록을 교체합니다. 참고: 이 엔드포인트는 제공된 리포지토리의 패턴만 덮어씁니다. 다른 모든 리포지토리는 영향을 받지 않습니다.
POST /settings/repo-blocklists/repos/upsert
요청 본문
매개변수타입필수설명
reposarrayYes저장소 차단 목록 객체 배열
각 저장소 객체는 다음을 포함해야 합니다:
필드타입필수설명
urlstringYes차단할 저장소 URL
patternsstring[]Yes차단할 파일 패턴 배열 (glob 패턴 지원)
응답
업데이트된 저장소 차단 목록을 반환합니다:
{
  repos: {
    id: string;
    url: string;
    patterns: string[];
  }[];
}
요청 예시
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": ["*"]
      }
    ]
  }'

저장소 차단 목록 삭제

차단 목록에서 특정 저장소를 제거합니다.
DELETE /settings/repo-blocklists/repos/:repoId
매개변수
매개변수타입필수설명
repoIdstringYes삭제할 저장소 차단 목록의 ID
응답
성공적으로 삭제되면 204 No Content를 반환합니다.
요청 예시
curl -X DELETE https://api.cursor.com/settings/repo-blocklists/repos/repo_123 \
  -u YOUR_API_KEY:

패턴 예시

일반적인 차단 목록 패턴:
  • * - 전체 저장소 차단
  • *.env - 모든 .env 파일 차단
  • config/* - config 디렉토리의 모든 파일 차단
  • **/*.secret - 모든 하위 디렉토리의 .secret 파일 차단
  • src/api/keys.ts - 특정 파일 차단