Zapier AI 영상 자동화: Zap 두 개와 Sume 웹훅 하나
Zap 하나는 Custom Request로 Sume 영상 실행을 시작하고, 두 번째 Zap은 Catch Raw Hook으로 Sume의 서명된 웹훅을 받아 Code 단계에서 검증합니다.

Sume로 Zapier AI 영상 자동화를 하려면 Zap 두 개를 쓰세요. Zap A는 Webhooks by Zapier의 Custom Request로 Format 실행을 시작하면서 communication.webhook_url을 Zap B의 Catch Raw Hook URL로 설정합니다. Zap B는 실행이 완료되거나 실패할 때 Sume가 보내는 서명된 POST 한 번을 받아 Code 단계에서 서명을 확인하고, 영상 URL을 다음 앱으로 넘깁니다.
Sume에는 Zapier 앱이 없으므로, 두 Zap 모두 HTTPS 호출을 직접 보내거나 받습니다. Sume 관련 사실은 Format 호출하기 (영문)와 Run 웹훅 (영문)에서, Zapier 동작은 2026-09-27에 확인한 Zapier 도움말 센터에서 가져왔습니다. 서명 방식은 Sume 영상 실행용 서명된 웹훅에서 설명합니다.
왜 Zap 하나가 아니라 두 개를 쓰나요?
실행은 생성 호출에 즉시 응답한 뒤 몇 분에 걸쳐 진행됩니다. 롱폼 호스트 영상은 보통 15~30분이면 끝납니다. Zap을 열어 둔 채 기다리지 말고, Sume가 Zap B를 호출하게 하세요. Zap B의 웹훅 URL은 Zap이 다른 사용자에게 이전될 때만 바뀌므로, Zap A는 이 URL을 고정값으로 둘 수 있습니다.
| 단계 | Zapier 구성 요소 | Sume 쪽 |
|---|---|---|
| Zap A 액션 | Webhooks by Zapier의 Custom Request | communication.webhook_url을 담은 POST /v1/formats/sume/{slug}/runs |
| Zap B 트리거 | Webhooks by Zapier의 Catch Raw Hook | 실행이 완료되거나 실패할 때 서명된 POST 한 번 |
| Zap B 2단계 | Code by Zapier의 JavaScript | <timestamp>.<raw_body>에 대한 HMAC-SHA256 |
| Zap B 3단계 | 게시용 앱 | 내구성 있는 media.sume.com URL인 payload.primary_output_url |
Zap A에서 실행을 어떻게 시작하나요?
Custom Request를 고르세요. Zapier는 이 액션의 Data 필드를 입력한 그대로 보내며, Zapier가 중첩 JSON에 쓰라고 안내하는 옵션도 이것입니다. 메서드는 POST로, URL은 https://api.sume.com/v1/formats/sume/sume-product-commercial/runs 같은 카탈로그 Format 주소로 설정하세요. 그다음 헤더와 Data를 채우세요.
Authorization: Bearer <key>만 보내고x-api-key는 함께 보내지 마세요. 둘 다 담긴 요청은401 unauthorized가 됩니다. 이 Zap용으로 만든 키를 쓰고, 키가 노출되면 Sume 대시보드에서 교체하세요.Content-Type: application/json.Idempotency-Key는 트리거 레코드의 ID에 버전을 붙여 만드세요. 같은 키와 본문이면 원래 실행과 함께200이 돌아오고 두 번째 청구는 없습니다.- Data를 채우세요. 비워 두면 Zapier가 이전 단계의 필드를 모두 보내는데, Sume는 알 수 없는 최상위 필드를
400 unknown_parameter로 거부합니다.
{
"instruction": "Make a vertical product commercial from the attached photo.",
"attachments": [
{ "type": "input_image", "image_url": "https://example.com/product.jpg" }
],
"generation_spend_cap_usd": 20,
"communication": { "webhook_url": "<Zap B's Catch Raw Hook URL>" }
}Zap B는 결과를 어떻게 받나요?
Catch Raw Hook은 최대 2 MB까지 본문을 파싱하지 않은 채 보존하고, 서명 확인에 필요한 헤더도 함께 담습니다. Zapier는 기본적으로 200으로 응답하며, Sume는 10초 안에 돌아온 2xx를 모두 전달 완료로 봅니다.
- Sume는 1 MiB까지의 영수증을 본문에 그대로 담습니다. 그보다 큰 영수증은
payload: null과, 영수증을 가져올error.result_url을 담아 도착합니다. - Zap B가 꺼져 있으면 Zapier는
404로 바뀌기 전까지 최대 몇 시간 동안 계속200으로 응답하므로,delivered상태라고 해서 Zap B가 실행됐다는 증거가 되지는 않습니다.formats:write가 있는 키로POST /v1/format-runs/{run_id}/webhook/redeliver를 호출하면 영수증을 다시 보내며, Sume의 자동 시도 10회가exhausted된 뒤에도 동작합니다. - 취소되거나 건너뛴 실행은 웹훅을 보내지 않습니다.
Code 단계에서 서명은 어떻게 검증하나요?
Code by Zapier는 표준 라이브러리와 함께 Node.js 22를 실행하며, 코드는 매핑한 값을 Input Data로만 볼 수 있습니다. 원본 본문, x-sume-webhook-timestamp와 x-sume-webhook-signature 헤더, 서명 시크릿을 매핑하세요. 서명 시크릿은 Sume 대시보드의 웹훅 탭에 있으며 API 키가 아닙니다. 시크릿을 교체한 뒤 24시간 동안은 헤더에 sume-v1= 항목이 두 개 실리므로 둘 중 하나만 일치해도 받아들이고, 오 분 범위를 벗어난 타임스탬프는 거부하세요. 이 단계의 output이 이후 단계가 매핑할 필드를 제공합니다.
const crypto = require("crypto");
const { body, timestamp, signature, secret } = inputData;
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) <= 300;
const digest = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${body}`)
.digest("hex");
const expected = Buffer.from(`sume-v1=${digest}`);
// Check every entry: during a rotation the header carries two.
const matches = signature.split(",").filter((entry) => {
const actual = Buffer.from(entry.trim());
return (
actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected)
);
});
const verified = Boolean(secret) && fresh && matches.length > 0; // empty secret: never verified
const { event, status, request_id, payload } = verified ? JSON.parse(body) : {};
output = { verified, event, status, request_id, video_url: payload?.primary_output_url ?? null };Zap B는 결과로 무엇을 해야 하나요?
이후 단계는 verified가 true이고 event가 format.run.terminal일 때만 실행되게 하세요. 유료 실행 전에 Sume의 테스트 보내기(Send test)로 검증 로직을 확인하세요(/dashboard/webhooks, 또는 account:write가 있는 키로 POST /v1/webhooks/test-deliveries). 테스트 보내기는 입력한 URL로 서명된 webhook.test 본문을 POST하며, 자세한 내용은 웹훅 전달 디버깅에서 다룹니다. Sume Format 실행 수명주기의 봉투 규칙은 Zap B에서 할 세 가지 확인으로 정리됩니다.
request_id로 중복을 제거하세요. 이 값은 실행 ID와 같고, 재시도할 때마다 똑같이 반복됩니다.status는 실행이 완료됐으면OK, 실패했으면ERROR입니다.OK면 내구성 있는media.sume.comURL인video_url을 게시하세요.payload가null로 왔거나(1 MiB를 넘는 영수증) 한 번 더 확인하고 싶다면, Webhooks by Zapier의 GET 단계에서 API 키로GET /v1/format-runs/{run_id}를 읽으세요. 그data가 같은 영수증입니다.
출처
관련 글
연동 카테고리의 다른 글
- Claude 커스텀 커넥터로 Sume 추가하기 (원격 MCP)
Customize > Connectors에서 Sume 호스팅 MCP 서버를 Claude에 추가하고, Sume OAuth 동의가 무엇을 부여하는지 확인한 뒤, 유료 도구를 허용할지 정하세요.
- Airtable 자동화 영상 생성 API: 레코드마다 영상 하나
Airtable Run a script 액션으로 callback_url과 함께 POST /v1/videos를 호출하고, 두 번째 자동화에서 Sume 웹훅을 받아 URL을 저장하세요.
- AWS Lambda로 Sume 웹훅 받기: 함수 URL과 HMAC
인증 유형이 NONE인 Lambda 함수 URL을 Sume에 넘기고, 이벤트 본문을 디코딩해 sume-v1 HMAC을 확인한 뒤 10초 시도 시간 안에 204로 응답하세요.
- Bubble API Connector: Sume API로 AI 영상 생성하기
Sume용 Bubble API Connector 설정법입니다. 키는 비공개 헤더에 두고, 수동 응답으로 설정 비용을 없애고, 백엔드에서 Job을 폴링합니다.
작성자 Sume