인증
키 형식, 키별 제한, 접근 가능한 작업과 키 유출 직후의 대응 방법입니다.
생성·조회·과금을 수행하는 모든 API 호출은 Authorization 헤더에 API 키를 보냅니다. 평가용 공개 모델 카탈로그만 예외로 키가 필요하지 않습니다.
Authorization: Bearer sk-spicy-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx네이티브 API(/api/v1/*)는 Bearer 키만 받습니다. 쿠키나 쿼리 매개변수는 받지 않습니다.
텍스트·영상 호환 엔드포인트(/v1, /v1beta)는 같은 키를 사용하며 Anthropic SDK의 x-api-key와 Google GenAI SDK의 x-goog-api-key 헤더도 받습니다. 따라서 공식 SDK에서 기본 URL만 바꿔 사용할 수 있습니다. 텍스트와 스트리밍을 참고하세요. 이 두 헤더는 /api/v1에서는 효력이 없으며 어떤 엔드포인트도 URL 쿼리 문자열의 키는 허용하지 않습니다.
API 키와 콘솔은 별개입니다
API 키는 /api/v1, /v1, /v1beta에서만 받습니다. 웹 콘솔은 별도 브라우저 세션을 사용합니다. 콘솔 로그인을 API 키로 쓸 수 없으며 유출된 API 키로 콘솔에 로그인할 수도 없습니다. 잘못된 종류의 인증 정보를 보내면 권한 오류가 아니라 항상 401입니다.
키 형식
고정 접두사 sk-spicy- 뒤에 소문자 16진수 48자가 이어집니다.
| 부분 | 용도 |
|---|---|
sk-spicy- | 로그, 저장소와 GitHub 비밀 정보 스캔에서 키를 식별하는 고정 접두사 |
| 다음 8자 | 키 기록을 빠르게 찾는 조회 부분. 전체 키도 검증합니다. |
| 나머지 40자 | 비밀 정보의 나머지 부분. 전체 키는 페퍼를 적용한 SHA-256 해시만 저장하므로 저희도 원래 키를 읽을 수 없습니다. |
접두사는 의도된 설계입니다. 다른 사람이 잔액을 쓴 뒤 알아차리기보다 스캔을 통해 알림을 받는 편이 낫습니다.
키는 한 번만 표시됩니다
대화상자를 닫기 전에 복사하거나 파일로 저장하세요. 잃어버리면 새 키를 생성해야 합니다. 키를 복구할 수 없도록 설계했습니다. 복구할 수 있다면 평문으로 저장한다는 뜻이기 때문입니다.
키 생성
- 콘솔 → API 키에서 키 생성을 누르세요.
- 사용할 서비스 이름을 붙이세요(
production backend,staging worker). 해지할 때 알아볼 수 있어야 합니다. - 선택적으로 고급에서 지출 한도, 허용 모델, IP 허용 목록과 만료일을 설정하세요. 모두 나중에 바꿀 수 있습니다.
- 키를 복사하거나 파일로 저장하고 보관했음을 확인하세요. 대화상자가 닫히면 다시 표시할 수 없습니다.
팀 소유자·관리자·개발자 역할이 키를 생성할 수 있습니다. 키는 콘솔 왼쪽 위에서 선택한 팀에 소속되며 사용량과 한도도 해당 팀에 집계됩니다. 팀마다 활성 키 최대 50개를 보유할 수 있습니다. 유료 작업을 수행하려면 이메일 인증과 잔액도 필요합니다. 계정 설정을 참고하세요.
키 보관 위치
- 컴퓨터에서 테스트: 터미널에서
export SPICY_API_KEY="…"를 설정하세요(창을 닫을 때까지 유효). 또는 코드가 읽는.env파일을 사용하세요. 첫 커밋 전에.env를.gitignore에 추가하세요. - 서버·호스팅 플랫폼: 비밀 정보 또는 환경 변수 설정을 사용하고 코드에서 환경의
SPICY_API_KEY를 읽으세요. - 소스 코드, 채팅, 스크린샷, 지원 문의 또는 AI 도우미 프롬프트에 키를 붙여 넣지 마세요.
클라이언트에 키를 배포하지 마세요
브라우저나 앱에 포함된 정보는 추출할 수 있습니다
번들링, 난독화, 여러 파일에 문자열을 나눠 저장하는 방식은 보호가 되지 않습니다. 개발자 도구나 디컴파일러를 가진 사람이 키를 얻을 수 있으며, 유출된 키는 잔액이나 한도가 소진될 때까지 실행됩니다.
프런트엔드에서 생성이 필요하면 자체 백엔드를 통해 호출하세요. 브라우저는 자체 서버를 호출하고 서버가 SpicyAPI를 호출합니다. 이 계층에서 자체 이용자별 할당량도 적용할 수 있습니다.
모바일 바이너리, 데스크톱 클라이언트, 공개 노트북, CI 로그와 지원 문의에 붙여 넣는 curl -v 출력에도 같은 원칙이 적용됩니다.
자신의 브라우저에서 자신만 쓰는 도구는 다릅니다. API는 브라우저 호출을 허용하므로 자체 키를 입력하는 SillyTavern 확장이나 롤플레잉 앱은 직접 호출할 수 있습니다. 위 규칙은 다른 사람이 불러오는 제품에 키를 넣는 경우입니다. 이런 개인 도구마다 일 지출 한도가 있는 별도 키를 부여하면 소비를 확인하고 각각 해지할 수 있습니다.
키별 제한
키 생성 시나 이후 콘솔에서 설정하며 서버에서 적용합니다.
| 제한 | 효과 | 도달 시 비즈니스 코드 |
|---|---|---|
| 일 지출 한도 | 직접 설정하지 않으면 새 키에는 한도가 없습니다. 설정 오류·유출의 비용을 제한하도록 금액을 정하세요. UTC 날짜마다 초기화 | 40202 |
| 월 예산 | 현재 달에 키가 사용할 수 있는 금액. UTC 기준 | 40202 |
| 누적 지출 한도 | 키가 전체 기간에 사용할 수 있는 총액. 파트너에게 주는 키에 유용 | 40202 |
| 만료 | 선택한 날짜의 UTC 종료 시점에 작동 중지 | 401 |
| IP 허용 목록 | 목록의 주소나 CIDR 범위만 호출 가능. 서버 통합에 권장 | 40302 |
| 모델 허용 목록 | 예: 스테이징 키를 저렴한 모델로 제한. 제한하지 않으면 나중에 추가된 모델도 호출 가능 | 40301 |
각 키 카드에서 현재 한도를 확인하고 언제든 변경할 수 있습니다.
한도는 이미 쓴 금액과 진행 중 작업의 선점 금액을 함께 계산하므로 작업이 끝나기 전에 도달할 수 있습니다. msg는 도달한 한도를 알려 줍니다. 40202의 msg가 플랫폼 할당량을 언급하면 키 한도가 아닙니다. 새 키를 만들어도 해결되지 않으므로 나중에 재시도하세요.
IP 허용 목록은 마지막 프록시 주소가 아니라 엣지 네트워크가 보는 실제 공개 주소와 비교합니다. 송신 주소는 서버 요청이 나오는 공인 IP입니다. 보통 호스팅 플랫폼의 네트워크 설정에서 확인할 수 있으며 자체 컴퓨터에서는 curl https://ifconfig.me로 확인합니다.
작업은 생성한 키에 귀속됩니다
API에서는 작업을 생성한 키만 해당 작업에 접근할 수 있습니다. 같은 팀이라도 다른 키를 사용하면 다음과 같습니다.
| 다른 키로 수행하는 동작 | 결과 |
|---|---|
작업 조회(recordInfo), 재시도, 폐기, 다운로드 링크 요청 | 없는 작업과 같은 404 |
작업 목록(GET /api/v1/jobs)이나 사용량(GET /api/v1/usage) 조회 | 해당 키 자체의 작업과 지출만 표시 |
같은 Idempotency-Key로 제출 반복 | 원래 작업 ID 없이 409 |
키 변경 후 409가 발생해도 작업이 생성되지 않았다는 뜻은 아닙니다
한 키로 제출하다 시간 초과 후 다른 키로 다시 보내면 409 뒤에 이미 실행 중이고 과금될 작업이 있을 수 있습니다. ‘미생성’으로 판단하여 새 멱등성 키로 제출하지 마세요. 두 번째 생성에 비용을 지불하게 됩니다. 첫 시도의 키로 다시 보내거나 콘솔에서 작업을 조회하세요.
두 가지는 키에 묶이지 않습니다. 작업 webhook은 생성한 키를 해지한 뒤에도 전달됩니다. 또한 어떤 키로 만들었든 팀의 모든 작업은 콘솔 → 로그에 표시되며 상세에 사용한 키가 나옵니다.
키 교체
- 운영·스테이징·로컬 환경마다 키 하나를 사용하면 다른 환경에 영향 없이 해지할 수 있습니다.
- 계획된 교체: 새 키를 만들고 새 작업만 새 키로 보내세요. 이전 키의 모든 작업이 종료 상태(늦어도 해당 작업의
deadlineAt)에 도달하고 결과를 수집한 뒤 이전 키를 해지하세요. 이전 키를 신뢰할 수 있을 때만 이 순서를 사용합니다. - 해지는 즉시 적용되며 되돌릴 수 없습니다. 캐시 만료를 기다릴 필요도 없으며 다시 활성화할 수도 없습니다. 새 키를 생성해야 합니다.
유출 후 대응
즉시 해지
콘솔 → API 키에서 키의 동작 메뉴를 열고 해지를 선택하세요. 즉시 적용됩니다.
진행 중인 자체 작업을 기다리지 마세요. 해지 후에는 그 키로 API에서 작업을 읽을 수 없습니다. 이미 승인된 작업은 계속 실행되며 과금됩니다. webhook이나 콘솔 → 로그에서 결과를 수집하세요. 유출 때는 기다리지 않아야 합니다.
대체 키 생성
새 키를 생성하고 서버 설정을 갱신하세요. 대체 키를 준비하는 동안 유출 키를 활성 상태로 두지 마세요.
사용 내역 확인
노출 기간의 콘솔 → 로그에서 모르는 모델, 비정상적인 수량, 설명할 수 없는 지출 등 직접 만들지 않은 작업을 확인하세요. 상세의 사용한 키와 CSV 내보내기의 작업별 키 ID를 확인할 수 있습니다. API 키 페이지에는 키별 마지막 사용 시각도 표시됩니다.
대체 키의 보호 강화
대체 키에 적절한 IP 허용 목록과 일 한도를 설정하고 코드, 로그나 배포 설정에서 원래 노출 원인을 제거하세요.
예상하지 못한 지출이 있다면 작업 ID 또는 request_id를 포함하여 콘솔 → 지원으로 문의하세요.
인증 실패 응답
{
"code": 401,
"msg": "Credentials are invalid or expired",
"request_id": "req_01k3m8x9q2z4v7n5p6r8s0t1w2"
}HTTP 상태도 401입니다. 모든 인증 실패는 code: 401을 반환하며 msg로 종류를 설명합니다.
msg 시작 부분 | 상황 | 대응 |
|---|---|---|
Missing credentials | 키가 도착하지 않음 | 헤더가 Authorization: Bearer …인지, 요청 프로세스에 SPICY_API_KEY가 설정되었는지 확인하세요. 한 터미널 창의 변수는 다른 창에 존재하지 않습니다. |
API key format is not recognized | 보낸 값이 SpicyAPI 키가 아님 | 접두사는 sk-spicy-입니다. Bearer 누락, 문자 누락·추가, 따옴표나 키와 함께 복사한 줄바꿈을 확인하세요. |
Credentials are invalid or expired | 형식은 맞지만 존재하지 않거나 해지·만료된 키 | 키 존재 여부를 탐색하지 못하도록 의도적으로 구별하지 않습니다. 콘솔 → API 키에서 상태를 확인하거나 새로 생성하세요. |
문구가 아니라 code로 분기하세요. 문구는 바뀔 수 있고 오류 언어를 따릅니다. 구분 방법은 오류에서 자세히 설명합니다.
이메일 미인증·계정 정지 등 계정 자체가 API를 호출할 수 없다면 403을 받습니다. 키를 바꿔도 해결되지 않습니다.

