인증
API 키의 형식과 보내는 방법, 권한과 범위, 만료, 인증 오류를 설명합니다
XenoCI API (https://xenoci.com/api/runner/v1)는 요청을 인증하는 두 가지 방법을 지원합니다
| 방법 | 자격 증명 | 적합한 용도 |
|---|---|---|
| API 키 | Authorization 헤더에 bearer 토큰으로 보내는 xci_live_… 시크릿 | CLI, MCP 서버, GitHub Actions, 스크립트와 서버에서 잡 실행과 조회 |
| 콘솔 세션 | 콘솔에 로그인하면 받는 쿠키 xci_console, 14일 유효 | 결제, 충전과 환불, 키 발급, 멤버와 워크스페이스 관리 (관리 API) |
두 방법은 서로 넘어가지 않습니다, API 키로는 콘솔 전용 엔드포인트를 부를 수 없고(403 console_only), 콘솔 세션은 사람이 브라우저에서만 씁니다, 빌드를 자동화하려면 API 키를 쓰세요
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로 거절됩니다 - 폐기는 즉시 적용됩니다, 그 키로 시작한 실행 중인 잡도 서버의 주기 점검(15초에서 30초)에서 멈추고 VM이 지워집니다 (주기 점검은 서버에 적용하는 중입니다)
- 공개 저장소에서 발견되어 자동 폐기된 키는
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 | 보관된 워크스페이스입니다, 키는 폐기되고 새 잡은 거절됩니다 |
ip_not_allowed | 403 | IP 허용 목록 밖에서 온 요청입니다 |
rate_limited | 429 | 요청이 너무 많습니다, retry_after_s만큼 기다렸다 다시 보내세요 |