인증
API 키의 형식과 보내는 방법, 권한과 범위, 만료, 인증 오류를 설명합니다
XenoCI API (https://xenoci.com/api/runner/v1)는 두 가지 자격 증명을 받습니다. API 키는 CLI, MCP 서버, GitHub Actions, 직접 보내는 HTTP 요청에 씁니다. 콘솔 세션(로그인 쿠키)은 콘솔 화면이 쓰고, 결제와 키, 멤버, 워크스페이스 관리처럼 콘솔 전용 엔드포인트는 이것만 받습니다
API 키 형식
키는 xci_live_로 시작하는 59자 문자열입니다
xci_live_<무작위 43자>_<검사 합 6자>마지막 여섯 자는 앞부분의 검사 합이라 잘못 복사된 키는 서버가 저장소를 보지 않고도 거절합니다. 서버에는 키의 해시만 저장되므로 콘솔에서도 만들 때 한 번만 보이고, 목록에는 앞 12자와 뒤 4자만 남습니다. 키를 만드는 방법은 API 키 받기에 있습니다
요청에 키 보내기
모든 요청의 Authorization 헤더에 Bearer 방식으로 넣습니다
curl https://xenoci.com/api/runner/v1/jobs \
-H "Authorization: Bearer $XENOCI_API_KEY"Authorization헤더가 있으면 그 값을 키로 봅니다, 쿠키가 같이 와도 키가 틀리면401입니다Bearer외의 방식이나 다른 헤더 이름은 받지 않습니다- CLI와 MCP는
XenoCI-Error-Format: 2헤더도 함께 보내 오류 본문을 최신 형식으로 받습니다, 직접 보낼 때도 붙이는 것을 권합니다
CLI, MCP, 액션은 키를 이렇게 찾습니다
| 도구 | 키를 읽는 곳 (앞이 우선) |
|---|---|
| xenocast CLI | 환경 변수 XENOCI_API_KEY, 그다음 xenocast config set api-key로 저장한 키 |
MCP 서버 (xenocast mcp) | MCP 서버 프로세스의 환경 변수 XENOCI_API_KEY, 그다음 저장한 키 |
GitHub Actions (Xeno-CI/build) | api-key 입력, 보통 ${{ secrets.XENOCI_API_KEY }} |
저장한 키는 macOS 키체인, Windows 자격 증명 관리자, Linux secret-service에 두고, 셋 다 없으면 ~/.config/xenoci/credentials.enc (AES-256-GCM 암호화 파일)에 둡니다. XENOCAST_CREDENTIAL_STORE로 저장소를 고를 수 있고 (keychain, wincred, secret-service, file), 서버 주소는 XENOCI_API_URL (기본 https://xenoci.com)로 바꿉니다
xenocast config show지금 어떤 키가 어디서 읽히는지 보여 줍니다
권한과 범위
키마다 권한과 워크스페이스가 정해져 있습니다
| 권한 | GET, HEAD, OPTIONS | POST, PATCH, PUT, DELETE |
|---|---|---|
실행과 조회 (run) | 허용 | 허용 (잡 제출, 취소, 업로드) |
조회만 (read) | 허용 | 403 insufficient_permission |
- 키는 만들 때 고른 워크스페이스 하나에서만 잡을 실행하고, 그 키로 쓴 사용량은 그 워크스페이스로 잡힙니다
- 어떤 키도 결제, 키 관리, 멤버와 워크스페이스 관리는 할 수 없습니다, 그 엔드포인트는
403 console_only를 돌려줍니다 GET /v1/me로 키가 가진 권한과 조직, 워크스페이스를 확인합니다, 응답의auth는api_key이고api_key.permission이run또는read입니다
만료와 폐기
- 만료는 키를 만들 때 만료 없음, 30일, 90일, 1년 가운데 고릅니다
- 만료되거나 폐기된 키, 보관된 워크스페이스의 키는 모두
401 invalid_api_key로 거절됩니다 - 폐기는 즉시 적용되지만 이미 시작한 잡은 끝까지 실행됩니다
- 공개 저장소에서 발견되어 자동 폐기된 키는
401 api_key_revoked_leaked를 받습니다, 새 키를 만들어 바꿔 넣으세요
인증 오류
오류 본문은 아래 모양이고 docs_url은 이 문서의 오류 코드 페이지로 연결됩니다. 모든 응답에는 X-Request-Id 헤더가 붙습니다
{
"error": {
"code": "invalid_api_key",
"message": "Unknown, revoked, expired or checksum-invalid key",
"retryable": false,
"fault": "client",
"request_id": "req_...",
"docs_url": "https://xenoci.com/docs/errors#invalid_api_key"
}
}| 코드 | HTTP | 뜻 |
|---|---|---|
api_key_required | 401 | Authorization: Bearer 헤더 없이 키가 필요한 엔드포인트를 불렀습니다 |
invalid_api_key | 401 | 모르는 키, 폐기되거나 만료된 키, 검사 합이 틀린 키, 보관된 워크스페이스의 키 |
api_key_revoked_leaked | 401 | 공개 유출 보고로 자동 폐기된 키 |
session_required | 401 | 콘솔 세션이 필요한 엔드포인트를 로그인 없이 불렀습니다 |
insufficient_permission | 403 | 조회만 키로 변경 요청을 보냈거나 역할이 모자랍니다 |
console_only | 403 | API 키로 콘솔 전용 엔드포인트를 불렀습니다 |
workspace_archived | 403 | 보관된 워크스페이스입니다, 키는 폐기되고 새 잡은 거절됩니다 |
rate_limited | 429 | 요청이 너무 많습니다, retry_after_s만큼 기다렸다 다시 보내세요 |