본문으로 건너뛰기

Alibaba의 Wan 2.7 text-to-image는 그리기 전에 추론 단계로 구도를 계획합니다. 요청당 1~4장을 일곱 화면비에서 약 1메가픽셀로 만들고, seed로 비교 결과를 안정시킵니다.

엔드포인트마다 필터링 수준이 다릅니다: 이미지 편집 — 무검열, 텍스트→이미지 — 순화됨.

최저가 $0.03/장

플레이그라운드

요청 보내기

빠른 시작

예시는 선택한 엔드포인트의 공개 파라미터 정의를 사용합니다. API 키와 예시 미디어를 바꾼 뒤 서버에서 요청하세요.

SDK 및 연동
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

API 인증

API 키는 서버 환경 변수 SPICY_API_KEY에 보관하세요. Bearer 인증을 사용하고 JSON 요청에는 Content-Type: application/json을 지정하세요.

Authorization: Bearer $SPICY_API_KEY
Wan 2.7 · Text to Image · 샘플 결과
샘플 결과이 예시 쓰기
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "alibaba/wan-2.7/text-to-image",
  "input": {
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "resolution": "1k",
    "num_outputs": 1,
    "aspect_ratio": "1:1"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

이 모델의 입력 스키마에서 뽑아낸 예시입니다. API도 모든 요청을 같은 스키마로 검증합니다.

입력 파라미터

이 필드들은 요청 본문의 input 객체 안에 넣습니다. 이름과 타입은 API와 동일합니다. 기본값이 적혀 있지 않은 필드는 임의로 가정하지 마세요.

promptstring필수

프레임을 적으세요. 피사체와 동작, 카메라 위치, 그다음 빛과 렌즈 순서입니다. Wan 2.7은 구도를 먼저 계획하므로, 형용사 더미보다 분명한 공간 관계 하나가 잘 통합니다.

기본값
지정되지 않음
제약 조건
minLength:1
maxLength:5000
seedinteger선택

0에서 2147483647까지입니다. 고정해 두고 한 번에 한 덩어리씩 바꾸세요. seed가 같으면 뽑기가 그대로라서 움직인 것은 바꾼 문장뿐입니다. 비교를 위한 값이지 똑같은 이미지를 보장하지는 않습니다.

기본값
지정되지 않음
제약 조건
minimum:0
maximum:2147483647
color_palettearray<object>선택

3~10가지 색으로 이루어진 선택 사항인 색상 테마입니다(권장은 8가지). 각 색을 #RRGGBB 16진수 코드로 입력하고, 원하면 이미지에서 차지할 비율을 퍼센트로 지정하십시오. 비워 둔 행은 남은 비율을 나눠 가지므로, 모두 비워 두면 색마다 같은 비중이 됩니다. 세트, 의상, 조명을 포함한 화면 전체의 색감을 이끕니다. 가격에는 영향이 없습니다.

기본값
지정되지 않음
제약 조건
minItems:3
maxItems:10
resolutionstring선택

1k 또는 2k이고 기본값은 1k입니다. 2k는 1k의 네 배 픽셀이며, 화면 비율은 aspect_ratio를 따릅니다.

기본값
"1k"
허용 값
"1k""2k"
num_outputsinteger선택요금에 영향

1에서 4까지이고, 모두 같은 브리프에 seed만 다른 결과입니다. seed 말고는 움직인 게 없어서 한 구도의 네 가지 해석을 그대로 비교할 수 있습니다. 과금은 장당입니다.

기본값
1
제약 조건
minimum:1
maximum:4
enable_thinkingboolean선택

생성을 시작하기 전에 프롬프트를 검토하게 합니다. 끄면 눈에 띄게 빨라지며, 프롬프트가 이미 구체적이라면 품질 차이는 거의 없습니다.

기본값
true
aspect_ratiostring선택

1:1, 4:3, 3:4, 16:9, 9:16, 3:2, 2:3 중 하나이고 기본값은 1:1입니다. 화소 예산이 전부 같아서 넓은 비율은 더 넓을 뿐 더 크지 않습니다.

기본값
"1:1"
허용 값
"1:1""4:3""3:4""16:9""9:16""3:2""2:3"

작업 추적

HTTP 202는 접수되었다는 뜻이며 생성 완료가 아닙니다. 반환된 taskId를 저장하고 같은 작업을 조회하세요. 결과를 기다리는 동안 작업을 다시 생성하지 마세요.

접수 응답
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

접수 응답에 이번 예상 비용이 포함되므로 앱의 작업 기록과 청구 화면에 같은 금액을 표시할 수 있습니다.

작업 조회
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

약 2초 간격으로 시작해서 점점 간격을 넓히세요. 종료 상태가 나오면 멈추고, 연결이 끊겼더라도 원래 taskId를 그대로 조회하세요. 다시 생성할 때는 처음에 쓴 Idempotency-Key와 본문을 그대로 써야 합니다.

아니면 콜백이 찾아오게 하세요
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

작업을 만들 때 callBackUrl을 넘기면 완료된 레코드가 POST로 전달됩니다 — 폴링 루프가 아예 필요 없습니다. 모든 전달에는 X-Webhook-Timestamp, X-Webhook-Signature, X-Webhook-Payload-Version이 함께 옵니다. 서명은 taskId.timestamp.sha256(body)에 대한 base64 HMAC-SHA256이므로 반드시 원본 바이트로 검증해야 합니다. JSON을 파싱했다가 다시 직렬화하면 바이트가 달라져 검증이 실패합니다. 실패한 전달은 재시도되므로 같은 taskId가 두 번 올 수 있습니다. 핸들러를 멱등하게 만드세요. 먼저 2xx로 답하고 처리는 그다음에 — 응답이 느리면 전달 실패로 간주됩니다.

결과 읽기

state가 succeeded일 때만 output을 사용하세요. 실패 시 errorCode, errorMessage, request_id로 원인을 확인하세요. 예시 비용과 상태는 실제 청구 내역이 아닙니다.

완료 응답 예시
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "alibaba/wan-2.7/text-to-image",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
          "mime": "image/png",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

사용 가능한 파일은 assets[].url에서 바로 열거나 다운로드할 수 있으며 API Authorization 헤더가 필요하지 않습니다. 서명 URL은 expiresAt에 만료됩니다. 보관 기간 내에 작업을 다시 조회하면 URL이 갱신됩니다. 처리 중이거나 사용할 수 없는 파일에는 URL이 없습니다. 서명 URL은 비공개로 보관하세요.

SDK 및 연동

앱, 터미널, AI 어시스턴트 또는 시각적 워크플로에서 SpicyAPI를 사용하세요. 원하는 설정 가이드를 선택하세요.

ComfyUI에서 쓰기

ComfyUI Manager나 아래 명령으로 SpicyAPI 노드를 설치한 뒤 캔버스에서 Wan 2.7 · Text to Image를 검색하세요. 노드는 이 페이지와 같은 옵션을 제공하며, 실행하기 전에 가격을 보여 줍니다.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi