줌(JOOM) 판매를 붙일 때 기댈 곳은 줌 판매자 API 명세뿐이었습니다. 여기서 API 란, 셀러센터 화면을 거치지 않고 판매 프로그램이 마켓 서버에 바로 요청을 보내 일을 처리하는 방식을 말합니다. 예전 판매 프로그램에는 줌 등록 화면이 이름만 있고 속이 비어 있어서, 참고할 요청 예시가 하나도 없었습니다.

명세는 YAML(사람과 프로그램이 함께 읽도록 짠 글 형식) 파일 하나로, 6,843줄이었습니다. 상품을 새로 만드는 창구 /products/create 의 받는 칸을 위에서부터 차례로 맞춰 갔고, 그중 화장품 셀러가 놓치기 쉬운 칸으로 눈에 걸린 것이 위험물 정보 dangerInfo 였습니다.
📌 required 표시가 붙은 칸은 넷뿐입니다
/products/create 에서 required(필수)로 표시된 칸은 mainImage(대표 이미지 URL), name(상품 이름), sku(상품 단위 코드), variants(옵션 배열) 넷입니다. variants 안의 옵션마다 다시 currency(통화)·price(가격)·sku 가 필수입니다.
dangerInfo 는 이 목록에 없습니다. 명세는 create 설명 첫머리에, 필수가 아닌 칸은 생략해도 되고 null 이나 빈 글자, false 같은 기본값을 일부러 보낼 필요도 없다고 적어 둡니다. 필수 칸만 맞추는 식으로 요청을 짜면 위험물 칸은 처음부터 빠진 채 나갑니다.
🔍 dangerInfo 는 값 두 개짜리 묶음입니다
명세의 Product.DangerInfo 는 이렇게 생겼습니다.
· isDangerous: 불리언(true·false). 설명은 "Is product dangerous.(위험물인가)" 한 줄이고, 이 묶음에서 유일한 필수 값
· dangerKinds: 종류 목록. 설명은 "if product is dangerous, dangerKinds must be not empty.(위험물이면 비어 있으면 안 된다)"

두 가지를 더 짚어 둡니다. dangerKinds 는 하나만 고르는 칸이 아니라 목록이라, 두 종류에 걸치는 상품은 둘 다 담을 수 있습니다. 또 이 묶음은 옵션(variants) 단위가 아니라 상품 단위로 한 번 붙습니다.
💡 예전 칸 dangerKind 는 이제 쓰지 않습니다
명세에는 끝에 s 가 없는 dangerKind 칸도 남아 있습니다. 종류를 하나만 받는 칸이고, deprecated(더는 쓰지 않음) 표시와 함께 이렇게 적혀 있습니다.
· Use dangerInfo instead. → 대신 dangerInfo 를 쓰라
상품을 고치는 창구 /products/update 의 받는 칸에는 dangerKind 가 아예 없고 dangerInfo 만 있습니다. 외주 개발자나 예전 도구가 dangerKind 를 채우고 있다면 dangerInfo 로 옮길 때입니다.
🎯 18가지 가운데 화장품이 볼 다섯
dangerKinds 에 넣을 수 있는 값은 18개로 닫혀 있습니다. 명세는 이름을 늘어놓기만 하고 값마다 풀이를 달지 않았습니다. 아래 한글은 이름을 옮긴 것입니다. 화장품과 직접 닿는 값은 이 다섯입니다.
· liquid(액체)
· semiLiquid(반액체)
· perfumes(향수)
· aerosoleAndGases(에어로졸과 가스, 철자는 명세 그대로)
· powder(분말)
나머지 열셋은 다음과 같습니다.
· adult(성인용), battery(배터리), withBattery(배터리 내장), magnets(자석)
· flammable(인화성), dangerousChemicals(위험 화학물질), highDensity(고밀도)
· sharp(날카로운 것), lookAlikeWeapon(무기처럼 보이는 것), weaponAccessories(무기 부속)
· hair(모발), plants(식물), teaLeafs(찻잎)
저희는 토너처럼 묽게 흐르는 화장품은 liquid, 크림류는 semiLiquid 로 신고합니다. 향수·파우더는 이름 그대로 perfumes·powder 에, 가스를 넣어 뿜는 스프레이는 aerosoleAndGases 에 맞습니다. 미스트처럼 펌프로 뿜는 액체인지 가스 스프레이인지에 따라 갈리는 제품은 명세가 답을 주지 않습니다. 용기와 내용물을 보고 골라야 합니다.

⚠️ 줌이 따로 매기는 위험물 정보
등록 요청이 받아들여져도 바로 판매 상태가 되지는 않았습니다. 저희 첫 등록(2026년 9월 22일)의 응답은 state(상태)가 pending(심사 대기)였고, 사유 코드 J1194 와 함께 "SKUs are being validated" 라는 문구가 붙어 있었습니다. SKU(옵션 코드)를 검증하고 있다는 뜻입니다. 심사 결과는 그 뒤 상품 정보의 review.reasons(심사 사유 목록)에서 읽습니다.
이 사유 항목 안에 dangerInfoByJoom 이라는 칸이 있습니다. 판매자가 보내는 dangerInfo 와 모양이 같은데, 명세 설명은 이렇습니다.
· Product danger info detected by Joom (e. g. when danger info provided by the merchant is incorrect).
→ 줌이 찾아낸 위험물 정보. 판매자가 넣은 정보가 틀린 경우가 그 예
판매자 신고와 별도로 줌이 판단한 값이 사유에 실려 올 수 있다는 뜻입니다. 다만 신고를 빼거나 틀렸을 때 판매가 멈추는지, 배송에 영향이 있는지는 명세에 없습니다. 저희 기록에도 그 결과는 없어서 여기서는 짐작하지 않겠습니다.
고치기 창구 /products/update 에도 dangerInfo 칸이 있습니다. 하지만 받는 칸에 있다고 다 고쳐지는 것은 아니었습니다. 같은 창구에 categoryId 도 있지만, 카테고리는 등록한 뒤 바꿀 수 없었습니다. 위험물 정보를 나중에 고쳤을 때 제대로 반영되는지는 저희 기록에 없습니다. 그러니 처음 올릴 때 맞게 넣어 두는 편이 안전합니다.
화장품을 줌에 올리는 셀러가 상품마다 볼 것은 둘입니다. 위험물인지(isDangerous), 그렇다면 어느 종류인지(dangerKinds). 직접 만들든 외주를 주든 판매 도구를 쓰든, 실제로 나가는 요청에 dangerInfo 가 실리는지 한 번은 확인해 보세요.
줌의 위험물 목록에는 액체·반액체·분말이 각각 한 종류로 올라 있고, 토너·크림·파우더가 바로 그 모양입니다. 이것만 기억해도 내 가게 상품을 올릴 때 이 칸을 건너뛰지 않게 됩니다.
'마켓API실전' 카테고리의 다른 글
| 줌 API gtin·msrPrice 형식: 숫자만 든 문자열, VAT 뺀 정가 (0) | 2026.10.30 |
|---|---|
| 줌 API description 은 plain text: 상세 이미지를 extraImages·richContent 로 나누는 법 (0) | 2026.10.28 |
| 줌 상품 수정 정리: 카테고리는 200 이 와도 그대로, 상품명은 재심사 (0) | 2026.10.21 |
| 쇼피 API 문서 444개의 변경 기록을 다 세어 봤습니다: 조용히 필수가 되는 항목들 (0) | 2026.10.18 |
| 쇼피 수수료 다섯 칸, 연결한 날 넣은 값을 그대로 두면 생기는 일 (0) | 2026.10.13 |
댓글