명령줄 도구(CLI)
spicyapi 명령 하나로 코드 없이 터미널에서 모델을 둘러보고, 가격을 확인하고, 이미지와 영상을 생성하고, 결과를 내려받으세요.
CLI란
spicyapi는 터미널에서 실행하는 작은 프로그램입니다. 터미널은 버튼을 누르는 대신 명령을 입력하는 창입니다. 명령 하나가 한 가지 일을 합니다. 내 계정으로 쓸 수 있는 모델을 나열하고, 생성 한 번에 얼마가 드는지 알려 주고, 이미지나 영상 생성을 시작하고, 끝날 때까지 기다렸다가 결과를 내려받을 링크를 건네줍니다.
코드는 한 줄도 쓰지 않습니다. 명령을 입력하고 Enter 키를 누른 다음, 돌아온 답을 읽으면 됩니다.
이럴 때 잘 맞습니다.
- 누군가 연동 코드를 짜기 전에 여러 모델을 써 보고 가격을 비교하고 싶을 때
- 내 컴퓨터에서 이미지나 영상을 생성하고 파일로 저장하고 싶을 때
- 같은 종류의 생성을 매번 웹 페이지를 클릭하지 않고 반복하고 싶을 때
- 무언가를 만들기 전에 모델의 정확한 설정을 확인하고 싶을 때
CLI가 다루는 것은 이미지와 영상 생성입니다. 텍스트·채팅 모델은 텍스트와 스트리밍에서 설명하는 채팅 호환 엔드포인트로 호출합니다.
공식 도구는 이 밖에도 세 가지가 더 있습니다. 명령을 직접 입력하고 싶다면 CLI를 고르세요.
| 도구 | 이럴 때 고르세요 |
|---|---|
| SDK | SpicyAPI를 호출하는 JavaScript나 TypeScript 프로그램을 작성할 때 |
| MCP 서버 | AI 코딩 어시스턴트가 이 단계들을 대신 실행하게 하고 싶을 때 |
| Agent Skill | AI 에이전트에게 SpicyAPI를 안전하게 쓰는 방법을 가르치고 싶을 때 |
다른 언어로 작성하고 계신가요? Python, Go, PHP, Java용 공식 SDK도 있습니다.
이 페이지의 명령으로 실수로 돈이 나가는 일은 없습니다
비용이 들 수 있는 명령은 tasks create와 tasks retry 두 개뿐입니다. 둘 다 과금하기 전에 멈추고 사용자에게 묻습니다. 나머지 명령은 몇 번을 실행해도 무료입니다.
할 수 있는 일
| 하고 싶은 일 | 명령 | 비용이 드나요? | API 키가 필요한가요? |
|---|---|---|---|
| SpicyAPI에 연결되는지 확인하기 | spicyapi status | 아니요 | 아니요 |
| 이 문서 검색하기 | spicyapi docs search <words> | 아니요 | 아니요 |
| 쓸 수 있는 모델과 가격 보기 | spicyapi models list | 아니요 | 예 |
| 모델 하나가 받는 설정 보기 | spicyapi models get <model> | 아니요 | 예 |
| 잔액 확인하기 | spicyapi balance | 아니요 | 예 |
| 키 하나로 얼마를 썼는지 보기 | spicyapi usage | 아니요 | 예 |
| 시작하지 않고 생성의 정확한 가격 받기 | spicyapi tasks quote | 아니요 | 예 |
| 이미지나 영상 생성 시작하기 | spicyapi tasks create | 예. 먼저 물어봅니다 | 예 |
| 생성이 끝날 때까지 기다리기 | spicyapi tasks wait <task-id> | 아니요 | 예 |
| 생성 하나와 결과 링크 보기 | spicyapi tasks get <task-id> | 아니요 | 예 |
| 최근 생성 목록 보기 | spicyapi tasks list | 아니요 | 예 |
| 실패한 생성 다시 실행하기 | spicyapi tasks retry <task-id> | 예. 먼저 물어봅니다 | 예 |
| 생성의 파일과 프롬프트를 영구히 삭제하기 | spicyapi tasks purge <task-id> | 아니요. 환불도 없습니다 | 예 |
| 입력으로 쓸 사진, 영상, 오디오 파일 업로드하기 | spicyapi files upload <path> | 아니요 | 예 |
| 결과를 내려받을 새 링크 받기 | spicyapi files download-url <task-id> | 아니요 | 예 |
| 콜백이 정말 SpicyAPI에서 왔는지 확인하기 | spicyapi webhooks verify | 아니요 | 아니요. 웹훅 서명 키를 씁니다 |
위 명령에서 <task-id>처럼 꺾쇠괄호로 감싼 단어는 "여기에 내 값을 넣으세요"라는 뜻입니다. 넣을 때 꺾쇠괄호는 빼세요.
시작하기 전에
준비물은 네 가지입니다. 터미널, Node.js, API 키, 그리고 CLI를 실행할 방법입니다. 처음이라면 10분 정도 걸립니다.
터미널 열기
터미널은 명령을 실행하는 텍스트 창입니다. 이 페이지의 모든 명령은 터미널에 입력하거나 붙여 넣은 뒤 Enter 키로 실행합니다.
Cmd + Space를 누르고 Terminal을 입력한 뒤 Enter 키를 누르세요. %나 $로 끝나는 줄이 있는 창이 열립니다. 거기에 입력하면 됩니다. 붙여 넣기는 Cmd + V입니다.
Node.js 22.13 이상 설치하기
CLI는 무료 프로그램인 Node.js 위에서 실행됩니다. 이미 설치되어 있는지 확인하세요.
node -vv22.13.0 또는 v22.14.0, v24.4.1처럼 그보다 높은 숫자가 나오면 준비된 것입니다. 더 낮은 숫자가 나오거나 command not found, is not recognized라는 메시지가 나오면 다음과 같이 하세요.
- nodejs.org에서 다운로드 페이지를 열고, 내 운영체제용 LTS 버전을 고르세요.
- 설치 프로그램을 실행하고 기본 옵션을 그대로 받아들이세요.
- 터미널을 닫고 새로 연 다음
node -v를 다시 실행하세요.
Node.js를 설치하면 npm과 npx도 함께 설치됩니다. 마지막 단계에서 쓰는 두 도우미 프로그램입니다.
API 키 만들기
API 키는 요청이 내 계정에서 왔다는 것을 SpicyAPI에 알려 주는 수단입니다.
- spicyapi.ai/register에서 계정을 만드세요. 계정은 차례대로 열릴 수 있습니다. 아직 가입할 수 없다면 대기자 명단에 등록하세요.
- 콘솔의 결제에서 잔액을 충전하세요. 생성 비용은 미국 달러로 잔액에서 나갑니다.
- API 키를 열고 키 만들기를 누르세요.
my laptop처럼 나중에 알아볼 수 있는 이름을 붙이세요. 필수 항목은 이름뿐입니다. - 키를 바로 복사하세요. 키는
sk-spicy-로 시작하며 한 번만 표시됩니다. 파일로 저장을 눌러 저장해도 됩니다.
새 키에는 직접 설정하지 않는 한 지출 한도가 없습니다. 일 한도를 걸어 두면 실수하거나 키가 유출되어도 큰 금액이 청구되지 않으며, 한도는 나중에 같은 페이지에서 바꿀 수 있습니다.
키는 비밀번호처럼 다루세요
키를 가진 사람은 누구나 내 잔액을 쓸 수 있습니다. 채팅이나 이메일로 보내지 말고, 스크린샷이나 지원 요청에 드러내지 말고, Git이나 GitHub에 올라가는 프로젝트 폴더에는 절대 저장하지 마세요. 유출됐다면 API 키 페이지에서 폐기하고 새 키를 만드세요.
키를 SPICY_API_KEY에 저장하기
CLI에는 로그인 명령이 없고, 키를 명령 옵션으로 받지도 않습니다. 대신 SPICY_API_KEY라는 환경 변수를 읽습니다. 환경 변수는 터미널이 자신이 실행하는 프로그램에 넘겨주는, 이름이 붙은 값입니다.
지금 열려 있는 창에서만 쓰려면(창을 닫으면 사라집니다):
export SPICY_API_KEY="sk-spicy-paste-your-key-here"계속 쓰려면, 같은 export 줄을 셸 시작 파일의 맨 끝에 추가하세요. 셸 시작 파일은 터미널을 열 때마다 실행되는 파일로, macOS에서는 ~/.zshrc, 대부분의 Linux에서는 ~/.bashrc입니다.
nano ~/.zshrc맨 아래에 export 줄을 붙여 넣고, Ctrl + O와 Enter 키를 차례로 눌러 저장한 뒤 Ctrl + X로 나오세요. Linux에서는 nano ~/.bashrc를 대신 쓰세요. 바뀐 내용은 새 터미널 창을 열어야 적용됩니다.
키 전체를 화면에 띄우지 않고 설정됐는지 확인하세요.
echo "${SPICY_API_KEY:0:9}"sk-spicy-가 나와야 합니다.
키를 둬도 되는 곳과 두면 안 되는 곳
셸 시작 파일과 Windows 계정 설정은 이 컴퓨터 안에만 남으므로 개인적으로 쓰기에는 괜찮습니다. 하지만 키를 프로젝트 안의 파일에 넣거나, 커밋하거나, 공유 문서에 붙여 넣는 일은 절대 하지 마세요. 터미널은 입력한 명령을 기억하기도 하므로, 여러 사람이 쓰는 컴퓨터라면 명령에 키를 직접 입력하기보다 시작 파일이나 Windows 설정 대화상자를 쓰세요.
CLI 실행 방법 고르기
방법은 두 가지이고, 명령은 똑같습니다.
npx는 필요할 때 CLI를 내려받아 실행합니다.
npx @spicyapi/cli status처음 실행하면 npm이 Need to install the following packages: @spicyapi/cli@… Ok to proceed? (y)라고 묻습니다. y를 입력하고 Enter 키를 누르세요.
이 방법을 쓴다면, 이 페이지에서 spicyapi라고 적힌 곳마다 npx @spicyapi/cli로 바꿔 입력하세요. 예를 들어 spicyapi models list는 npx @spicyapi/cli models list가 됩니다.
첫 결과 받기
이미지 한 장을 생성하고 내려받는 과정을 따라가 봅니다. 단계마다 명령, 대략 어떤 화면이 나오는지, 방금 무슨 일이 일어났는지를 보여 줍니다. 숫자, ID, 시각은 사람마다 다르게 나옵니다.
MODEL_ID_FROM_CATALOG를 실제 모델 ID로 바꾸세요
MODEL_ID_FROM_CATALOG는 모델이 아니라 자리표시자입니다. 3단계에서 실시간 카탈로그(spicyapi models list, GET /api/v1/models와 같은 목록)에서 실제 ID를 고르는 방법을 보여 줍니다. 이 페이지에 자리표시자가 나오는 곳마다 내 ID를 붙여 넣으세요. 자리표시자를 그대로 보내면 "찾을 수 없음" 오류만 돌아옵니다.
연결 확인하기
spicyapi statusSpicyAPI is reachable — api.spicyapi.ai answered in 523 ms.무슨 일이 일어났나요? CLI가 SpicyAPI에 정상 작동 중인지 물었습니다. 키가 필요 없고 비용도 들지 않습니다. "could not be reached"가 나오면 인터넷 연결이나 프록시를 확인하세요. 문제 해결을 보세요.
잔액 확인하기
spicyapi balanceavailable: 12.34
held: 0.06
total: 12.40무슨 일이 일어났나요? 키를 쓰는 첫 명령입니다. 금액은 미국 달러입니다. available은 지금 쓸 수 있는 금액, held는 아직 실행 중인 생성을 위해 예약된 금액, total은 둘을 더한 값입니다. 잔액을 선불 충전금과 프로모션 지원금으로 나눠 보여 주는 funding 줄이 함께 나올 수도 있습니다.
Error: SPICY_API_KEY is required for authenticated API operations가 나오면 이 터미널 창에 키가 설정되지 않은 것입니다. 그 아래 Next: 줄에 설정 방법이 나옵니다. 시작하기 전에도 함께 보세요.
모델 고르기
spicyapi models list --modality image --json{
"total": 1,
"items": [
{
"model": "MODEL_ID_FROM_CATALOG",
"displayName": "Example image model",
"modality": "image",
"tasks": ["text-to-image"],
"enabled": true,
"available": true,
"pricing": [
{ "variant": "", "unit": "per_image", "price": "0.03", "currency": "USD" }
]
}
]
}이 예시는 줄인 것입니다. 실제 목록에는 모델도 필드도 더 많습니다.
무슨 일이 일어났나요? CLI가 내 계정으로 지금 호출할 수 있는 모델을 내 가격과 함께 가져왔습니다. enabled와 available이 모두 true인 모델을 하나 골라, 마우스로 선택하는 식으로 그 model 값을 복사하세요. 그 값이 모델 ID입니다. ID는 maker/model/task 같은 모양입니다.
price는unit당 미국 달러 가격입니다. 단위는per_image(이미지 한 장),per_second(영상 1초),per_request(요청 한 번),per_1k_tokens(토큰 1,000개) 중 하나입니다.pricing항목이 여러 개라면 해상도 같은 설정에 따라 가격이 달라진다는 뜻입니다.- 이름으로 모델을 찾으려면
--search와 이름의 일부를 덧붙이세요.
--json을 붙이면 목록을 들여쓰기한 읽기 쉬운 JSON으로 보여 줍니다. 붙이지 않으면 목록 전체가 긴 한 줄로 몰려 나옵니다.
그 모델이 받는 설정 보기
spicyapi models get MODEL_ID_FROM_CATALOG --json{
"model": "MODEL_ID_FROM_CATALOG",
"enabled": true,
"available": true,
"inputSchema": {
"type": "object",
"required": ["prompt"],
"properties": {
"prompt": { "type": "string" },
"aspect_ratio": { "type": "string", "enum": ["1:1", "16:9", "9:16"] }
},
"additionalProperties": false
}
}무슨 일이 일어났나요? inputSchema는 그 모델의 설정 목록입니다. 이 페이지에서는 이것을 입력이라고 부릅니다.
required에는 반드시 보내야 하는 설정이 나열됩니다. 여기서는prompt하나뿐입니다.properties에는 모델이 받는 설정이 빠짐없이 나열되며, 그 밖의 설정은 허용되지 않습니다. 모르는 이름이나 철자가 틀린 이름이 하나만 있어도 요청 전체가 거부됩니다.enum에는 그 설정에 쓸 수 있는 값이 나열되며, 다른 값은 쓸 수 없습니다.
모델마다 설정이 다르므로, 고른 모델의 설정은 늘 직접 확인하세요. 서버가 이미 검사를 마친 완성된 입력 예시를 보려면 spicyapi models list --search <name> --include-examples --json을 실행하고 examples를 보세요.
입력을 파일에 적기
입력은 input.json이라는 파일에 적어, 터미널이 지금 있는 폴더에 저장하세요. 파일을 쓰면 따옴표 문제를 피할 수 있습니다. 특히 Windows에서 그렇습니다.
세 줄을 한꺼번에 붙여 넣으세요.
cat > input.json <<'EOF'
{"prompt": "A paper lantern glowing on a rainy street at night, cinematic light"}
EOF무슨 일이 일어났나요? 앞 단계에서 본 설정 이름으로 무엇을 생성할지 적었습니다. 따옴표는 둥근 따옴표가 아니라 반드시 곧은 따옴표(")여야 합니다.
가격 확인하기
spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.jsonquoteId: eyJ2IjoxLCJtIjoi…
model: MODEL_ID_FROM_CATALOG
estimatedCost: 0.03
maxCharge: 0.03
currency: USD
quantity: 1
unit: per_image
expiresAt: 2026-09-17T08:05:00Z무슨 일이 일어났나요? SpicyAPI가 바로 이 요청의 가격을 계산했습니다. 아무것도 시작되지 않았고, 아무것도 과금되지 않았습니다. estimatedCost는 예상 비용, maxCharge는 청구될 수 있는 최대 금액입니다. 이 단계는 건너뛰어도 됩니다. 다음 명령이 가격을 다시 받아 오고, 돈을 쓰기 전에 보여 주기 때문입니다.
생성을 시작하고 기다리기
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitCLI가 먼저 가격을 보여 주고 확인을 요청합니다.
Estimated charge: USD 0.03; maximum charge: USD 0.03. Quote expires: 2026-09-17T08:05:00Z.
Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
Create a billable task with model MODEL_ID_FROM_CATALOG? Estimated charge: USD 0.03; maximum charge: USD 0.03. Quote expires: 2026-09-17T08:05:00Z. Idempotency-Key: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241. Continue? [y/N]y를 입력하고 Enter 키를 누르세요. 그 밖의 답은 모두 취소로 처리되며, 아무것도 과금되지 않습니다. 견적이 만료되기 전, 5분 안에 답하세요.
SpicyAPI가 일을 접수하는 즉시 CLI가 작업 ID를 보여 줍니다.
Accepted: job_01k3m8x9q2z4v7n5p6r8s0t1w3
If waiting is interrupted: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3이미지는 보통 몇 초, 영상은 몇 분이 걸립니다. 끝나면 결과가 나옵니다.
idempotencyKey: 4f6755a5-0d72-4420-9f6b-9faf0e2b0241
accepted: {"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3","state":"queued","estimatedCost":"0.03","deadlineAt":"2026-09-17T08:30:00Z"}
task: {"taskId":"job_01k3m8x9q2z4v7n5p6r8s0t1w3","model":"MODEL_ID_FROM_CATALOG","state":"succeeded","output":{"assets":[{"key":"tasks/…/result.png","url":"https://…","expiresAt":"2026-09-17T08:20:00Z","mime":"image/png","width":1024,"height":1024}]},"cost":"0.03","settled":true,…}무슨 일이 일어났나요? y라고 답하자 SpicyAPI가 생성을 접수했습니다. 이때부터 이 생성을 작업이라고 부르며, 예상 금액이 잔액에서 예약됩니다. 그다음 CLI가 몇 초마다 작업 상태를 확인하며 끝날 때까지 기다렸습니다. 마지막 줄에서 "state":"succeeded"와 output 안의 "url"을 찾으세요. cost는 settled가 true가 되면 최종 청구 금액입니다. 결과를 여러 줄에 걸쳐 읽기 쉽게 보고 싶다면 명령에 --json을 붙이세요.
창을 닫아도 작업은 취소되지 않습니다
접수된 작업은 언제나 끝까지 실행되고 정상적으로 과금됩니다. Ctrl + C를 누르거나 터미널을 닫으면 기다리기만 멈출 뿐입니다. 작업 ID를 적어 두었다가 spicyapi tasks wait <task-id>로 다시 이어 가세요. 기다리기가 중단된 작업 다시 이어 가기를 보세요.
결과 내려받기
url은 키 없이 쓸 수 있는 직접 다운로드 링크로, 약 20분 동안 유효합니다. 브라우저에 붙여 넣고 파일을 저장하거나, 터미널에서 내려받으세요. 링크에 & 문자가 들어 있으므로 따옴표는 그대로 두세요.
curl -L -o result.png "PASTE_THE_URL_HERE"파일 확장자는 mime에 맞추세요. image/png는 .png, image/jpeg는 .jpg, video/mp4는 .mp4입니다.
링크가 만료됐다면 spicyapi files download-url <task-id>로 새 링크를 받거나, 새 링크를 돌려주는 spicyapi tasks get <task-id>를 실행하세요.
무슨 일이 일어났나요? 결과를 내 컴퓨터로 복사했습니다. 되도록 빨리 내려받으세요. SpicyAPI는 생성된 파일을 최대 약 14일 동안만 보관하고(계정에서 더 짧게 설정했다면 그보다 짧게), 그 뒤에는 영구히 삭제합니다. 데이터 보관과 파기를 보세요.
출력 읽는 법
- 일반 출력은 한 줄에
name: value를 하나씩 보여 줍니다.output이나retention처럼 여러 부분으로 이루어진 값은 한 줄짜리 JSON으로 나옵니다. --json옵션을 붙이면 전체 응답을 들여쓰기한 JSON으로 보여 줍니다. 모든 명령에서 쓸 수 있고, 명령 이름 앞에 붙이든 뒤에 붙이든 같습니다.spicyapi --json balance와spicyapi balance --json은 같은 명령입니다.- 결과는 화면의 표준 출력으로, 안내 메시지는 오류 출력으로 나갑니다. 가격, 멱등 키,
Accepted:줄, 오류는 안내 메시지에 속합니다. 그래서spicyapi --json tasks get <task-id> > task.json을 실행하면task.json에는 결과만 저장되고, 안내 메시지는 계속 화면에 나옵니다. - 오류는
Error: <what went wrong> (request req_…)모양이며, 보통 무엇을 하면 되는지 알려 주는Next:줄이 뒤따릅니다.--json을 붙이면 오류는error,type,status,code,requestId가 든 한 줄짜리 JSON 객체로 나오고,Next:줄은 없습니다. 키가 설정되지 않았을 때type은MissingApiKeyError입니다. 지원팀에 문의할 때는req_…값을 함께 알려 주세요. - 금액은
0.03처럼$기호 없이 텍스트로 적은 미국 달러입니다. - 시각은 UTC입니다.
2026-09-17T08:05:00Z끝의Z가 UTC라는 뜻입니다. - 종료 상태는 명령이 성공하면
0, 실패하면0이 아닌 값입니다. 스크립트에서 이 값으로 성공 여부를 확인할 수 있습니다.
명령 레퍼런스
모든 명령에는 도움말이 내장되어 있습니다. spicyapi tasks create --help처럼 --help를 붙이세요.
전역 옵션과 환경 변수
다음 옵션은 모든 명령에서 쓸 수 있습니다.
| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--json | 전체 결과를 JSON으로 출력합니다 | 꺼짐 | 아니요 |
--timeout-ms <milliseconds> | SpicyAPI의 응답 하나를 얼마나 기다린 뒤 포기할지 정합니다. 1~120000 | 30000(30초) | 아니요 |
--max-retries <count> | 반복해도 안전한 요청이 네트워크 오류, 429, 서버 오류로 실패했을 때 자동으로 몇 번 다시 시도할지 정합니다. 0~5 | 2 | 아니요 |
--api-base-url <url> | API 요청을 다른 주소로 보냅니다. 보통은 쓸 일이 없습니다 | https://api.spicyapi.ai/api/v1 | 아니요 |
--service-base-url <url> | status가 확인하는 주소입니다. 보통은 쓸 일이 없습니다 | https://api.spicyapi.ai | 아니요 |
-V, --version | CLI 버전을 출력합니다 | — | 아니요 |
-h, --help | 명령의 도움말을 보여 줍니다 | — | 아니요 |
| 환경 변수 | 용도 |
|---|---|
SPICY_API_KEY | API 키입니다. status, docs search, webhooks verify를 뺀 모든 명령에 필요합니다 |
SPICY_WEBHOOK_SECRET | 웹훅 서명 키입니다. webhooks verify가 읽습니다 |
SPICY_API_BASE_URL, SPICY_SERVICE_BASE_URL | 위의 두 주소 옵션과 같습니다. 주소는 https://를 써야 합니다 |
status
하는 일: SpicyAPI가 정상 작동 중이고 내 컴퓨터에서 접속할 수 있는지 확인합니다.
spicyapi status옵션이 없습니다. 키가 필요 없습니다. 무료입니다.
출력: 한 문장입니다. SpicyAPI is reachable — … answered in … ms.가 나오면 모두 정상입니다. could not be reached는 내 컴퓨터가 아무 응답도 받지 못했다는 뜻이니 네트워크나 프록시를 확인하세요. is not healthy나 reports it is not ready는 저희 쪽 문제입니다. 현재 발생 중인 장애는 status.spicyapi.ai에서 볼 수 있습니다.
--json을 붙이면 원래의 점검 결과가 나옵니다. 중요한 것은 operational: true입니다. 공개 주소에서는 상태가 404인 readiness 항목이 나오는 것이 정상입니다.
docs search
하는 일: 주제에 맞는 문서 페이지를 찾습니다. CLI에 내장된 작은 색인을 검색하므로 키가 필요 없고 SpicyAPI를 호출하지도 않습니다. 결과마다 이 문서 사이트 docs.spicyapi.ai의 페이지 링크가 붙습니다.
spicyapi docs search [words] [--limit <count>]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
words | 찾을 단어입니다. 비워 두면 페이지 목록을 보여 줍니다 | 비어 있음 | 아니요 |
--limit <count> | 결과의 최대 개수입니다. 1~25 | 10 | 아니요 |
spicyapi docs search retentionslug: retention
title: Retention and destruction
summary: What the platform caps are, how far down you can dial them, how to destroy a task's content, and what we cannot promise.
keywords: ["privacy","delete","storage","retention","per-request retention","purge","destroy"]
url: https://docs.spicyapi.ai/docs/retention결과가 여러 개면 차례로 이어서 나오며, 각 결과는 slug:로 시작합니다. 일치하는 결과가 없으면 그렇다고 알려 주고, 종료 상태는 그래도 0입니다.
No documentation matched "refnd". Try fewer or different words, or run `spicyapi docs search` without words to browse pages.--json을 붙였을 때 일치하는 결과가 없으면 빈 목록 []이 나옵니다. 무료입니다.
models list
하는 일: 내 계정으로 지금 호출할 수 있는 모델을, 내 계정에 적용되는 가격과 함께 나열합니다.
spicyapi models list [options]| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--modality <type> | image, video, text 모델만 보여 줍니다. audio도 받지만, 지금은 오디오 모델을 제공하지 않습니다 | 전체 | 아니요 |
--task <task> | text-to-image, edit, image-to-video, text-to-video, reference-to-video 같은 한 가지 작업 종류만 보여 줍니다 | 전체 | 아니요 |
--provider <name> | 모델 제작사(모델을 만든 회사나 연구소) 한 곳의 모델만 보여 줍니다. provider 값과 정확히 같아야 합니다 | 전체 | 아니요 |
--search <text> | ID나 표시 이름에 이 텍스트가 들어 있는 모델만 보여 줍니다. 대소문자는 구분하지 않습니다 | 없음 | 아니요 |
--include-schema | 모든 모델의 전체 설정(inputSchema)을 함께 보여 줍니다. 출력이 훨씬 커집니다 | 꺼짐 | 아니요 |
--include-examples | 서버가 이미 검사를 마친 입력 예시(examples)를 함께 보여 줍니다 | 꺼짐 | 아니요 |
spicyapi models list --modality video --task image-to-video --json출력: total과 items입니다. --json을 붙이지 않으면 모든 항목이 한 줄에 나오므로 꼭 붙이세요. 항목마다 가장 쓸모 있는 필드는 다음과 같습니다.
| 필드 | 의미 |
|---|---|
model | 다른 명령에 쓸 모델 ID |
displayName, provider, modality, tasks | 이름, 모델 제작사, 출력 유형, 작업 종류 |
enabled, available | 둘 다 true인 모델을 쓰세요 |
pricing | 가격 구간마다 하나씩 있는 항목입니다. variant(예: 해상도), unit, USD 기준 price가 들어 있고, 할인이 적용되면 regularPrice와 offerLabel도 들어 있습니다 |
taskTimeoutSeconds | 생성이 expired로 끝나기 전까지 실행될 수 있는 시간 |
maxOutputDurationSeconds | 이 모델이 허용하는 가장 긴 영상 길이(제한이 있는 모델만) |
무료입니다. 다만 모델 목록 조회도 계정의 요청 빈도 제한에 포함되므로, 생성할 때마다 먼저 실행할 필요는 없습니다.
models get
하는 일: 모델 하나를 받는 설정까지 포함해 자세히 보여 줍니다.
spicyapi models get <model>| 인자 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
model | 정확한 모델 ID입니다. ID에 들어 있는 슬래시는 그대로 두면 됩니다 | — | 예 |
spicyapi models get MODEL_ID_FROM_CATALOG --json출력: models list와 같은 필드에 inputSchema가 더해집니다. inputSchema에서는 required(반드시 보내야 하는 설정), properties(허용되는 모든 설정과 그 형식), enum(쓸 수 있는 값 목록), minimum과 maximum(숫자 범위), default(설정을 생략했을 때 쓰이는 값)를 읽으세요. x-ui라는 항목은 입력 양식을 만들 때 쓰는 힌트이므로 무시해도 됩니다. 무료입니다.
balance
하는 일: 계정에서 쓸 수 있는 금액을 보여 줍니다.
spicyapi balance옵션이 없습니다. 무료입니다.
출력: available(지금 쓸 수 있는 금액), held(아직 실행 중인 작업을 위해 예약된 금액), total이며, 모두 미국 달러입니다. funding이 함께 나올 수도 있습니다. 잔액을 선불 충전금과 프로모션 지원금으로 나누고, 지원금이 언제 만료되는지, 어떤 모델에 쓸 수 있는지도 보여 줍니다. 생성할 때마다 잔액을 먼저 확인할 필요는 없습니다. tasks create가 대신 확인합니다.
usage
하는 일: 지금 쓰는 API 키로 실행한 생성 수와 그 비용을 날짜별·모델별로 묶어 보여 줍니다.
spicyapi usage [--from <date>] [--to <date>]| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--from <date> | 포함할 첫날입니다. UTC 기준 YYYY-MM-DD 형식 | 오늘을 포함한 최근 7일 | 아니요 |
--to <date> | 포함할 마지막 날의 다음 날입니다. UTC 기준 YYYY-MM-DD 형식. 기간은 최대 92일입니다 | 오늘을 포함한 최근 7일 | 아니요 |
spicyapi usage --from 2026-09-01 --to 2026-10-01이 명령은 9월 한 달 전체를 봅니다. --to에 적은 날은 포함되지 않습니다. 두 옵션을 모두 생략하면 오늘을 포함한 최근 7일을 보여 줍니다.
출력: from, to, currency, totalCalls, totalSpend에 이어, days(날짜별 calls, succeeded, failed, spend)와 models(같은 숫자를 모델별로)가 나옵니다. totalSpend에는 최종 청구 금액만 합산됩니다. days와 models는 같은 작업을 두 가지 방식으로 묶은 것이므로 서로 더하지 마세요. 키 하나가 아니라 계정 전체의 사용량은 콘솔의 사용량 페이지에서 보세요.
무료입니다. 1분에 30번까지만 호출할 수 있으므로, 합계를 확인하는 데 쓰고 반복문 안에서는 쓰지 마세요.
tasks quote
하는 일: 생성 한 번에 정확히 얼마가 드는지 알려 줍니다. 생성을 시작하지도, 금액을 예약하지도 않습니다.
spicyapi tasks quote --model <model> --input-file <path>| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--model <model> | 정확한 모델 ID | — | 예 |
--input-file <path> | 입력을 JSON 파일에서 읽습니다. -를 쓰면 파이프로 명령에 넘긴 내용에서 읽습니다 | — | 이 옵션과 --input-json 중 하나 |
--input-json <json> | 입력을 JSON 텍스트로 직접 넘깁니다. 따옴표 처리는 --input-file이 더 쉽습니다 | — | 이 옵션과 --input-file 중 하나 |
--callback-url <url> | 쓸 예정인 콜백 주소입니다. 가격을 매기는 요청의 일부이기 때문입니다 | 없음 | 아니요 |
출력: quoteId, model, estimatedCost, maxCharge, currency, quantity(예: 과금되는 초 수), unit, expiresAt입니다. 견적은 5분 동안 유효합니다.
무료이며 확인을 묻지 않습니다. 모델이나 설정을 비교할 때 쓰세요. tasks create는 견적을 직접 받으므로, 그 전에 꼭 실행해야 하는 것은 아닙니다.
tasks create
하는 일: 이미지나 영상 생성을 시작합니다. 비용이 듭니다. CLI는 언제나 가격을 먼저 보여 주고 확인을 받습니다.
spicyapi tasks create --model <model> --input-file <path> [options]| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--model <model> | 정확한 모델 ID | — | 예 |
--input-file <path> | 입력을 JSON 파일에서 읽습니다. -를 쓰면 파이프로 명령에 넘긴 내용에서 읽으며, 이때는 --yes도 필요합니다 | — | 이 옵션과 --input-json 중 하나 |
--input-json <json> | 입력을 JSON 텍스트로 직접 넘깁니다 | — | 이 옵션과 --input-file 중 하나 |
--wait | 작업이 끝날 때까지 기다렸다가 결과를 출력합니다 | 꺼짐: 작업 ID만 출력하고 바로 끝남 | 아니요 |
--yes | 확인 질문을 건너뜁니다. 가격을 이미 알 때만, 주로 스크립트에서 쓰세요 | 꺼짐: 물어봄 | 아니요 |
--idempotency-key <key> | "이 생성 한 건"에 붙이는 이름입니다. 24시간 안에 같은 키로 명령을 다시 실행하면 새 작업 대신 같은 작업을 돌려받습니다. 최대 128자 | 실행할 때마다 새 무작위 키 | 아니요 |
--retention <duration> | 이 작업의 생성 미디어, 결과 페이로드, 프롬프트와 그 밖의 입력 텍스트를 평소보다 일찍 삭제합니다. 30m, 1h, 7d 또는 초 단위 숫자. 줄이기만 할 수 있습니다. 0이면 작업이 끝나는 즉시 삭제합니다. 과금 기록은 언제나 남습니다 | 계정 설정 | 아니요 |
--callback-url <url> | 작업이 끝나면 SpicyAPI가 호출할, https://로 시작하는 공개 주소입니다. 일반 http://, localhost, 사설 네트워크 주소는 거부됩니다. 서버를 운영할 때만 쓸모가 있습니다. 웹훅을 보세요 | 없음 | 아니요 |
--poll-interval-ms <milliseconds> | --wait와 함께: 몇 밀리초마다 확인할지 정합니다. 100~60000 | 2초에서 시작해 10초까지 점점 늘어남 | 아니요 |
--wait-timeout-ms <milliseconds> | --wait와 함께: 이 시간이 지나면 기다리기를 멈춥니다. 1~86400000. 작업은 계속 실행됩니다 | 600000(10분) | 아니요 |
진행 순서:
- CLI가 입력을 읽고 JSON 객체인지 확인합니다. 입력이 없으면 여기서 멈춥니다.
- 스크립트 안처럼 질문에 답할 사람이 없는데
--yes도 없으면 여기서 멈춥니다. - 견적을 받아 예상 청구 금액, 최대 청구 금액, 견적 만료 시각, 멱등 키를 출력합니다.
Continue? [y/N]라고 묻습니다.y나yes라고 답해야만 계속합니다. 기본 답은 아니요입니다.- 견적 가격으로 작업을 만듭니다. 예상 금액이 잔액에서 예약되며, 그 금액이 이 작업에 청구될 수 있는 최대 금액이기도 합니다.
--wait가 없으면idempotencyKey,taskId,state(queued),estimatedCost,deadlineAt을 출력하고 끝납니다.--wait가 있으면 곧바로Accepted: <task-id>와 복구 명령을 출력하고, 기다린 뒤idempotencyKey,accepted, 끝난task를 출력합니다.
deadlineAt은 작업이 expired로 끝나기 전에 완료될 수 있는 가장 늦은 시각입니다. 다운로드 링크나 파일이 만료되는 시각이 아닙니다.
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --waitmacOS와 Linux에서는 입력을 명령 안에 바로 적을 수도 있습니다.
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-json '{"prompt": "A paper lantern on a rainy street"}'기다리기가 실패해도 작업은 계속 실행됩니다
기다리기는 시간 제한, 네트워크 문제, Ctrl + C 때문에 일찍 끝날 수 있습니다. 작업 자체는 계속 실행되고 정상적으로 과금됩니다. 처음에 출력된 Accepted: 줄에 작업 ID가 있으니 spicyapi tasks wait <task-id>로 이어 가세요. --idempotency-key 없이 같은 create 명령을 그냥 다시 실행하지 마세요. 두 번째 생성이 시작되고 그만큼 과금됩니다.
기다리기가 (Ctrl + C가 아니라) 오류로 끝나면, 마지막 몇 줄에 필요한 정보가 모두 다시 나옵니다. 위로 스크롤해 Accepted: 줄을 찾을 필요가 없습니다.
Error: task job_01k3m8x9q2z4v7n5p6r8s0t1w3 did not reach a terminal state within 600000ms
Task job_01k3m8x9q2z4v7n5p6r8s0t1w3 was accepted and may still be running; only the wait stopped.
Recover: spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3
To replay the same request without creating a second task, reuse --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241.429나 서버 오류처럼 해결 방법이 알려진 오류였다면 Next: 줄이 이어집니다. --json을 붙이면 같은 정보가 오류 객체의 taskId, idempotencyKey, recover에 들어 있습니다.
tasks wait
하는 일: 이미 시작한 작업이 끝날 때까지 기다립니다.
spicyapi tasks wait <task-id> [options]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
task-id | 작업 ID. 예: job_01k3m8x9q2z4v7n5p6r8s0t1w3 | — | 예 |
--poll-interval-ms <milliseconds> | 몇 밀리초마다 확인할지 정합니다. 100~60000 | 2초에서 시작해 10초까지 점점 늘어남 | 아니요 |
--wait-timeout-ms <milliseconds> | 이 시간이 지나면 기다리기를 멈춥니다. 1~86400000 | 600000(10분) | 아니요 |
spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000출력: 작업 상태가 succeeded, failed, expired 중 하나가 되면 끝난 작업을 tasks get과 같은 필드로 보여 줍니다. 작업은 성공했지만 파일을 아직 복사하는 중이라면 조금 더 기다립니다.
시간 제한이 다 되면 Error: task … did not reach a terminal state within 600000ms가 나옵니다. 실패가 아니라 작업이 아직 실행 중이라는 뜻입니다. 필요하면 --wait-timeout-ms를 더 길게 잡아 다시 기다리세요. 기다리기를 멈춰도 작업은 절대 취소되지 않습니다. 무료입니다.
tasks get
하는 일: 작업 하나의 현재 모습을 보여 줍니다. 상태, 비용, 결과 링크, 그리고 내용이 언제 삭제되는지입니다.
spicyapi tasks get <task-id>| 인자 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
task-id | 작업 ID | — | 예 |
작업을 만든 API 키와 같은 키를 쓰세요. 다른 키로는 "찾을 수 없음"이 나옵니다.
출력 필드:
| 필드 | 의미 |
|---|---|
state | queued(시작 대기 중), running, succeeded, failed, expired(시간 초과) 중 하나. 예전 작업에는 canceled가 보일 수도 있습니다 |
output.assets | 결과입니다. 결과마다 url(약 20분 동안 유효한 다운로드 링크), expiresAt(그 링크가 작동을 멈추는 시각), mime(파일 형식), 크기 정보, key가 들어 있습니다. pending: true는 파일을 아직 복사하는 중이라는 뜻이니 몇 초 뒤에 다시 시도하세요. unavailable: true는 복구할 수 없다는 뜻입니다 |
errorCode, errorMessage | 작업이 실패한 이유. 오류를 보세요 |
cost, settled | USD 기준 청구 금액. settled가 true가 되면 확정됩니다 |
input | 내가 보낸 설정. 프롬프트 보관 기간이 끝나면 삭제됩니다 |
createdAt, completedAt, deadlineAt | 만든 시각, 끝난 시각, 끝날 수 있는 가장 늦은 시각 |
contentState | present(내용이 아직 저장되어 있음), expired(보관 규칙에 따라 삭제됨), purged(내가 삭제함) |
retention | outputsExpireAt(결과 파일이 삭제되는 시각), promptsExpireAt(프롬프트 텍스트가 지워지는 시각), source(어느 설정이 이 기간을 정했는지) |
sourceTaskId | 이 작업이 다른 작업의 재시도일 때만 들어 있습니다 |
일반 출력은 Outputs expire: …나 Content: Destroyed — you removed the outputs … 같은 쉬운 말 요약으로 끝납니다. 호출할 때마다 새 다운로드 링크를 돌려줍니다. 무료입니다.
tasks list
하는 일: 지금 쓰는 API 키로 만든 작업을 한 페이지씩 나열합니다.
spicyapi tasks list [options]| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--from <date> | 포함할 첫날. UTC 기준 YYYY-MM-DD | 오늘로 끝나는 7일 | 아니요 |
--to <date> | 포함할 마지막 날의 다음 날. UTC 기준 YYYY-MM-DD. 기간은 최대 92일입니다 | 위와 같음 | 아니요 |
--state <state> | 한 가지 상태의 작업만 보여 줍니다. queued, running, succeeded, failed, canceled, expired 중 하나 | 전체 | 아니요 |
--model <model> | 정확한 모델 ID 하나의 작업만 보여 줍니다 | 전체 | 아니요 |
--limit <count> | 한 페이지의 작업 수. 1~100 | 20 | 아니요 |
--cursor <cursor> | 이전 페이지의 nextCursor 값으로 그다음부터 이어서 봅니다 | 첫 페이지 | 아니요 |
spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --state failed출력: items(항목마다 taskId, model, state, cost, settled, createdAt, deadlineAt, completedAt), hasMore, nextCursor입니다. hasMore가 true이면 --from과 --to까지 똑같은 명령에 --cursor와 nextCursor 값을 더해 다시 실행하세요. 목록에는 다운로드 링크가 없으니, 원하는 작업은 tasks get으로 여세요. 무료입니다.
tasks retry
하는 일: failed나 expired로 끝난 작업을 새 ID를 가진 새 작업으로 다시 실행합니다. 비용이 듭니다.
spicyapi tasks retry <task-id> [options]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
task-id | 다시 실행할, 실패했거나 만료된 작업 | — | 예 |
--wait | 새 작업이 끝날 때까지 기다립니다 | 꺼짐 | 아니요 |
--yes | 확인 질문을 건너뜁니다 | 꺼짐: 물어봄 | 아니요 |
--idempotency-key <key> | 같은 키로 재시도를 다시 실행하면, 또 다른 작업 대신 이미 만든 새 작업을 돌려받습니다 | 실행할 때마다 새 무작위 키 | 아니요 |
--poll-interval-ms <milliseconds> | --wait와 함께: 얼마나 자주 확인할지 | 2초에서 시작해 10초까지 점점 늘어남 | 아니요 |
--wait-timeout-ms <milliseconds> | --wait와 함께: 이 시간이 지나면 기다리기를 멈춥니다 | 600000(10분) | 아니요 |
Retry source task … Continue? [y/N]라고 묻습니다. tasks create와 달리, 묻기 전에 가격을 보여 주지 않습니다. 새 작업은 모델의 현재 가격으로 과금되므로, 가격이 중요하다면 spicyapi models get <model>로 먼저 확인하세요.
출력: idempotencyKey, 새 taskId, sourceTaskId(원래 작업), state, estimatedCost(예약된 금액), deadlineAt입니다.
- 재시도할 수 있는 작업은
failed와expired, 그리고 예전의canceled작업뿐입니다. 성공한 결과를 다른 버전으로 또 받고 싶다면tasks create를 쓰세요. - 원래 입력을 바꾸지 않고 그대로 다시 쓰므로, 재시도는 실패 원인이 일시적이었을 때만 도움이 됩니다. 먼저
errorCode를 확인하세요. 실패한 작업 다시 시도하기와 오류를 보세요. - 입력이 가리키던 업로드 파일이 그사이 만료됐다면 재시도는 실패합니다. 파일을 다시 업로드하고
tasks create를 쓰세요. - 재시도는 원래 작업의 보관 설정을 그대로 따릅니다.
- 작업 ID를 보기 전에
tasks create의 연결이 끊겼다면, 그것은 실패한 작업이 아닙니다. 대신 기다리기가 중단된 작업 다시 이어 가기의 복구 방법을 따르세요.
tasks purge
하는 일: 끝난 작업의 생성 미디어, 결과 페이로드(저장된 결과 데이터), 프롬프트와 그 밖의 입력 텍스트를, 만료를 기다리지 않고 바로 영구히 삭제합니다.
spicyapi tasks purge <task-id> [--yes]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
task-id | 끝난 작업: succeeded, failed, expired, canceled 중 하나 | — | 예 |
--yes | 확인 질문을 건너뜁니다 | 꺼짐: 물어봄 | 아니요 |
아직 queued나 running인 작업은 파기할 수 없습니다. 취소도 할 수 없습니다. 취소 명령도 취소 API도 없습니다. 그러니 spicyapi tasks wait <task-id>로 끝날 때까지 기다린 뒤 파기하세요.
되돌릴 수 없는 작업이므로, 무엇이 삭제되는지 설명하고 확인을 받습니다. 남겨 두고 싶은 것은 먼저 내려받으세요.
출력: taskId, contentState(purged), purgedAt, contentRemovedBy(user), billingRetained(언제나 true), mediaDeletionPending이 나오고, 이어서 무엇을 파기했는지와 저장된 미디어가 1분쯤 안에 지워진다는 안내가 한 줄 나옵니다. contentState가 여전히 present라면 이번에는 아무것도 지워지지 않은 것이니, 잠시 뒤에 다시 시도하세요.
무료이며, 환불이 아닙니다. 과금 원장 항목, 청구 금액, 모델, 상태, 타임스탬프, 요청 ID는 기록으로 남습니다. 데이터 보관과 파기를 보세요.
files upload
하는 일: 이미지로 영상을 만들 때 첫 장면으로 쓸 사진처럼, 내 컴퓨터의 파일을 업로드하고 입력에 넣을 spicy:// 주소를 돌려줍니다.
spicyapi files upload <path> [--content-type <type>]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
path | 업로드할 파일 | — | 예 |
--content-type <type> | 파일 이름으로 형식을 알 수 없을 때 지정하는 파일 형식: image/jpeg, image/png, image/webp, image/gif, video/mp4, video/webm, audio/mpeg, audio/wav | 확장자로 판단 | 아니요 |
지원하는 파일은 최대 10 MiB의 .jpg, .jpeg, .png, .webp, .gif 이미지, 그리고 최대 90 MiB·600초의 .mp4, .webm 영상과 .mp3, .wav 오디오입니다. 모델에 따라 더 낮은 제한이 따로 있을 수 있습니다.
spicyapi files upload ./start-frame.jpgfileId: fil_01k3m8x9q2z4v7n5p6r8s0t1w3
status: ready
bytes: 402118
contentType: image/jpeg
sha256: a91f4c2e5b7d16809e3f2a4c8d0b61e7c4a890e5d2f71b3c609ae8427d15f0c6
uri: spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3
expiresAt: 2026-09-18T09:12:11Z
width: 1280
height: 720출력: uri 값을 출력된 그대로 복사해 모델의 파일 설정(흔히 image_url)에 넣으세요. expiresAt까지, 보통 하루 동안 쓸 수 있습니다. 그 뒤에는 파일을 다시 업로드하세요. 업로드는 무료입니다.
files download-url
하는 일: 끝난 작업의 결과를 내려받을 새 링크를 만듭니다. 링크를 출력할 뿐, 파일을 저장하지는 않습니다.
spicyapi files download-url <task-id> [--key <key>]| 인자 또는 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
task-id | 성공한 작업 | — | 예 |
--key <key> | 작업이 결과를 여러 개 만들었을 때, 어느 결과의 링크를 만들지 정합니다. tasks get의 output.assets에 있는 key 값을 쓰세요 | 첫 번째 결과 | 아니요 |
출력: key, url, expiresAt입니다. 링크는 약 20분 동안 유효하니 브라우저로 열거나 curl로 내려받으세요. 아직 성공하지 않은 작업이면 "찾을 수 없음"이 나옵니다. 파일을 아직 복사하는 중이면 충돌 오류가 나니 몇 초 뒤에 다시 시도하세요. 작업의 파일이 이미 삭제됐다면 새 링크를 만들 수 없습니다. 무료입니다.
webhooks verify
하는 일: SpicyAPI 콜백을 받는 서버를 운영한다면(--callback-url 참고), 저장해 둔 콜백 하나가 진짜이고 변조되지 않았는지 확인합니다. 전부 내 컴퓨터 안에서 실행되며 API 키가 필요 없습니다.
spicyapi webhooks verify --body-file <path> --timestamp <seconds> --signature <base64> --payload-version <version>| 옵션 | 하는 일 | 기본값 | 필수 |
|---|---|---|---|
--body-file <path> | 받은 그대로, 바이트 하나 다르지 않게 저장한 콜백 본문 파일 | — | 예 |
--timestamp <seconds> | X-Webhook-Timestamp 헤더 값 | — | 예 |
--signature <base64> | X-Webhook-Signature 헤더 값 | — | 예 |
--payload-version <version> | X-Webhook-Payload-Version 헤더 값: 1 또는 2 | — | 예 |
--secret-env <name> | 웹훅 서명 키가 들어 있는 환경 변수의 이름입니다. 서명 키 자체는 명령줄에 입력하지 않습니다 | SPICY_WEBHOOK_SECRET | 아니요 |
--tolerance-seconds <seconds> | 타임스탬프가 내 컴퓨터 시계와 얼마까지 차이 나도 되는지 | 300 | 아니요 |
출력: 성공하면 payload(콜백 내용), payloadVersion, taskId, deliveryId(버전 2), timestamp가 나옵니다. 하나라도 맞지 않으면 오류를 출력하고 0이 아닌 종료 상태로 끝납니다. 무료입니다.
서명 키는 가입할 때 자동으로 만들어지지만, 그 값은 보여 주지 않습니다. 복사할 수 있는 키를 받으려면 콘솔에서 웹훅을 열고 발급을 누르세요(이미 키가 설정되어 있다면 교체). 새 키는 한 번만 표시됩니다. 교체는 유예 기간 없이 즉시 적용되며, 이전 키는 바로 서명을 멈춥니다. 웹훅을 보세요.
자주 쓰는 레시피
이미지 생성하기
spicyapi models list --modality image --json
spicyapi models get MODEL_ID_FROM_CATALOG --json
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait첫 번째 명령에서 ID를 고르고, 두 번째 명령이 보여 주는 설정으로 input.json을 만든 다음, 세 번째 명령을 실행하고 y로 확인하세요. 단계별 설명은 첫 결과 받기에 있습니다.
사진으로 영상 만들기
image-to-video 모델과 그 설정 찾기
spicyapi models list --modality video --task image-to-video --json
spicyapi models get MODEL_ID_FROM_CATALOG --jsoninputSchema에서 첫 장면으로 쓸 사진의 설정(보통 image_url), 길이 설정(보통 duration_seconds), 그리고 required에 있는 항목을 찾으세요.
입력 적기
첫 결과 받기에서처럼 input.json을 만들되, 모델의 설정 이름과 내 uri를 쓰세요.
{
"prompt": "Slow push-in, rain running down the window",
"image_url": "spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3",
"duration_seconds": 5
}가격을 확인한 뒤 생성하기
spicyapi tasks quote --model MODEL_ID_FROM_CATALOG --input-file input.json
spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --wait --wait-timeout-ms 1800000영상은 보통 초 단위로 과금되므로, 고른 길이에 따라 가격이 달라집니다. 영상은 몇 분씩 걸릴 수 있어서, 이 예시에서는 기본값 10분 대신 최대 30분까지 기다립니다. 첫 결과 받기에서처럼 url로 .mp4를 내려받으세요.
업로드한 사진은 하루 동안 쓸 수 있습니다. 그 뒤에는 다시 업로드하세요.
기다리기가 중단된 작업 다시 이어 가기
터미널이 닫히거나, 네트워크가 끊기거나, 컴퓨터가 잠자기에 들어가거나, 기다리는 시간이 다 되어도 작업은 계속 실행됩니다. 어떻게 다시 찾아갈지는 화면에서 무엇을 봤는지에 따라 다릅니다.
-
Accepted: job_…줄이나, 오류 아래의Recover:줄을 봤다면 작업 ID를 가지고 있는 것입니다. 다시 기다리거나, 상태만 확인하세요.spicyapi tasks wait job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait-timeout-ms 1800000 spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3 -
Idempotency-Key:줄만 봤다면(예를 들어 작업을 만드는 도중에 연결이 끊긴 경우), 모델과 입력까지 똑같은 명령에 그 키를 더해 다시 실행하세요.spicyapi tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key 4f6755a5-0d72-4420-9f6b-9faf0e2b0241 --waitCLI는 가격을 보여 주고 다시 묻습니다. 하지만 첫 시도가 접수됐었다면, SpicyAPI는 두 번째 작업을 시작해 과금하는 대신 그 작업을 그대로 돌려줍니다. 같은 API 키로 24시간 동안 통합니다. 첫 시도가 아예 도착하지 않았다면 지금 한 번만 작업이 만들어집니다.
-
둘 다 없다면 최근 작업 목록을 띄워, 시각과 모델로 찾으세요.
spicyapi --json tasks list --limit 10
실패한 작업 다시 시도하기
먼저 실패한 이유를 알아보세요.
spicyapi tasks get job_01k3m8x9q2z4v7n5p6r8s0t1w3그다음 errorCode를 읽으세요. 실패하거나 만료된 작업은 보통 예약 금액이 전액 해제됩니다. 다만 모델 페이지에 명시된 일부 콘텐츠 거부는 접수 시 견적 금액으로 과금됩니다. 최종 청구액은 settled와 cost로 확인하세요. tasks retry는 같은 입력을 다시 보내므로, 원인이 일시적이었을 때만 도움이 됩니다.
errorCode | 할 일 |
|---|---|
rate_limited, upstream_unavailable, timeout, upstream_failed | 잠시 기다렸다가 한 번만 재시도하세요. 또 실패하면 재시도를 멈추세요. timeout이라면 tasks create로 길이를 줄이거나 해상도를 낮춰 보세요 |
generation_failed | 재시도하지 마세요. 같은 입력은 대개 같은 이유로 실패합니다. 프롬프트나 이미지를 바꾼 뒤 tasks create를 쓰세요 |
invalid_asset | 재시도는 예전 파일을 그대로 쓰므로 재시도하지 마세요. 파일을 다시 업로드한 뒤 새 uri로 tasks create를 쓰세요 |
invalid_request, unsupported_combination | 그대로 재시도하지 마세요. 설정을 바꾼 뒤 tasks create를 쓰세요 |
content_rejected | 그대로 재시도하지 마세요. 모델이 이 요청을 거절한 것입니다. 프롬프트를 바꾸거나 다른 모델을 고른 뒤 tasks create를 쓰세요 |
전체 목록은 오류에 있습니다.
재시도가 의미 있을 때 실행하세요. 새 작업이 만들어지고, 그만큼 과금됩니다.
spicyapi tasks retry job_01k3m8x9q2z4v7n5p6r8s0t1w3 --wait사용량 내보내기
지금 쓰는 키의 한 달 사용량을 파일로 저장합니다.
spicyapi --json usage --from 2026-09-01 --to 2026-10-01 > usage-2026-09.json이 파일에는 날짜별·모델별 합계가 들어 있습니다. 작업 하나하나의 목록이 필요하다면 spicyapi --json tasks list --from 2026-09-01 --to 2026-09-08 --limit 100을 같은 방식으로 저장하되, hasMore가 true인 동안 nextCursor를 따라가세요. 계정 전체의 수치와 인보이스는 콘솔에 있습니다.
스크립트에서 CLI 실행하기
스크립트 안에서는 Continue? [y/N]에 답할 사람이 없으므로, 비용이 드는 명령은 --yes를 붙이지 않으면 실행을 거부합니다. --yes를 붙인다면 다음을 지키세요.
- 먼저 견적을 받고 스크립트 안에서 가격을 확인하세요.
- 생성마다
poster-2026-09-17-v1처럼 고정된--idempotency-key를 따로 붙이세요. 그래야 스크립트를 두 번 실행해도 두 번 과금되지 않습니다. --json을 붙이고 결과에서state를 읽으세요. 명령이 종료 상태0으로 끝났다고 해서 작업이 성공했다는 보장은 없습니다.- 콘솔에서 키에 지출 한도를 설정하세요.
spicyapi --json tasks create --model MODEL_ID_FROM_CATALOG --input-file input.json --idempotency-key poster-2026-09-17-v1 --yes --wait > result.json비용, 확인, 안전
비용이 드는 명령. tasks create와 tasks retry뿐입니다. 가격은 미국 달러입니다. 견적 받기, 목록 보기, 확인하기, 업로드, 다운로드, 삭제는 무료입니다.
가격을 먼저 보기. tasks quote는 아무것도 시작하지 않고 요청의 가격을 계산합니다. tasks create는 견적을 직접 받아, 묻기 전에 Estimated charge와 maximum charge를 보여 줍니다. 작업이 접수되면 예상 금액이 예약(held)되며, 그 금액이 청구될 수 있는 최대 금액이기도 합니다. 작업이 성공하면 실제로 만들어진 만큼만, 예약 금액을 넘지 않게 정산되고, 남은 금액은 잔액으로 돌아옵니다.
확인 질문. Continue? [y/N]는 y를 입력하지 않는 한 답이 아니요라는 뜻입니다. --yes는 대신 답해 주므로, 가격을 이미 알 때만 쓰세요. 스크립트 안이나 파이프로 입력을 넘길 때처럼 CLI가 물어볼 수 없는 곳에서 --yes가 없으면, 예라고 가정하지 않고 실행을 거부합니다. tasks purge도 삭제는 되돌릴 수 없으므로 같은 방식으로 묻습니다. tasks retry도 묻지만, 가격을 먼저 보여 주지는 않습니다.
멱등 키, 쉽게 말하면. 주문 번호처럼 생성 한 건에 붙이는 이름표입니다. tasks create와 tasks retry는 실행할 때마다 멱등 키를 하나씩 출력합니다. 인터넷 연결이 끊겨 생성이 시작됐는지 확실하지 않다면, 같은 명령에 --idempotency-key와 출력된 값을 붙여 다시 실행하세요. 원래 작업을 돌려받고, 두 번 과금되지 않습니다. 이 이름표는 같은 API 키로 24시간 동안 통합니다. 다른 생성에 다시 쓰지 마세요. 같은 키를 다른 입력과 함께 보내면 거부됩니다.
취소는 없습니다. 접수된 작업은 취소할 수 없습니다. Ctrl + C를 누르거나, 터미널을 닫거나, 키를 폐기해도 기다리기만 멈출 뿐, 작업은 끝까지 실행되고 정상적으로 과금됩니다.
실패하거나 만료된 작업은 보통 예약 금액이 전액 해제됩니다. 다만 모델 페이지에 명시된 일부 콘텐츠 거부는 접수 시 견적 금액으로 과금됩니다. 최종 청구액은 settled와 cost로 확인하세요.
남기고 싶은 것은 내려받으세요. 결과 파일은 최대 약 14일 동안(계정 설정이나 --retention이 더 짧으면 그보다 짧게) 보관된 뒤 영구히 삭제됩니다. 다운로드 링크는 약 20분 동안 유효하지만, 파일이 남아 있는 동안은 언제든 새 링크를 받을 수 있습니다. 업로드한 파일은 하루 동안 쓸 수 있습니다. 프롬프트 텍스트는 기본적으로 30일 뒤에 지워집니다. 과금 기록은 남습니다. 데이터 보관과 파기를 보세요.
지출 한도. 키마다 일 한도, 월 한도, 누적 한도를 API 키 페이지에서 걸 수 있습니다. 새 키에는 직접 설정하기 전까지 한도가 없습니다. 한도를 넘게 될 작업은 시작 전에 거부됩니다.
내 키. CLI는 키를 SPICY_API_KEY에서만 읽고, 절대 출력하지 않으며, 오류 안내에서도 앞의 아홉 글자(sk-spicy-)까지만 보여 줍니다.
더 자세한 내용: 과금, 멱등성, 작업 확정과 재시도.
문제 해결
화면에 나온 메시지를 찾으세요. SpicyAPI에서 온 오류는 (request req_…)로 끝납니다. 지원에 문의할 때는 그 값을 함께 알려 주되, 키는 절대 보내지 마세요.
모든 오류 코드는 오류에서, 복구 방법은 문제 해결과 복구에서 설명합니다.
소스
이 패키지는 MIT 라이선스이고 **github.com/spicyapi-ai/spicy-cli**에서 공개적으로 개발됩니다. 이 페이지에서 설명한 명령의 구현을 읽거나, 문서와 다르게 동작하는 부분을 알리거나, 변경을 제안하는 일 모두 저장소에서 하면 됩니다.
다음 단계
모델 카탈로그와 스키마
실시간 카탈로그와 모델별 설정이 어떻게 작동하는지
과금
가격, 예약되는 금액, 지출 한도, 인보이스
데이터 보관과 파기
파일과 프롬프트를 얼마나 보관하는지, 더 일찍 지우는 방법
오류
모든 오류 코드와, 재시도할 가치가 있는지 여부
TypeScript SDK
같은 일을 내 JavaScript나 TypeScript 코드에서
Python SDK
같은 일을 내 Python 코드에서
Go SDK
같은 일을 내 Go 코드에서
MCP 서버
AI 코딩 어시스턴트가 이 단계들을 실행하게 하고, 비용이 들기 전에는 확인을 받습니다
Agent Skill
AI 에이전트에게 안전한 SpicyAPI 작업 방식을 가르칩니다
빠른 시작
같은 흐름을 HTTP API로 직접

