{"openapi":"3.1.0","info":{"title":"INKFLOW 인쇄 가격표 · 견적 API","version":"1.0.0","summary":"책 · 프리미엄 명함의 온라인 판매가를 기계가 읽는 JSON 으로 받는 읽기 전용 API","description":"INKFLOW 견적 엔진이 계산한 **온라인 판매가**(회원 가입 없이 주문할 때의 금액)를 JSON 으로 알려 드립니다. 읽기 전용이고 인증이 필요 없어요.\n\n- 금액은 **부가세 포함 · 배송비 별도**이고 단위는 원(KRW)입니다.\n- 응답마다 **기준 시각**(generatedAt · computedAt)과 **validUntil** 이 있어요. validUntil 이 지난 금액은 인용하지 말고 다시 요청해 주세요. 금액을 인용하실 때는 기준 시각과 주소(citation)를 함께 적어 주세요.\n- **최종 금액은 파일 · 사양 확인 뒤 주문 화면에서 확정**됩니다. 응답의 orderUrl 이 같은 사양이 채워진 주문 화면이에요.\n- 금액 칸이 비어 있는 것은 두 가지로 구분돼요. **unavailable** = 그 사양은 그 방식으로 자동 견적이 없다는 사실, **pending** = 기준 단가를 확인하고 있는 일시적인 상태(자동 견적이 없다는 뜻이 아니에요). 금액이 하나도 없고 확인 중인 방식이 있으면 200 이 아니라 503(PRICING_UNAVAILABLE · reason ALL_CHECKING)으로 답해요.\n- 확인되지 않은 금액은 싣지 않습니다. 오류 · 한도 · 확인 중 응답에는 금액이 없어요.\n- 사람이 읽는 가격표: https://inkflow1st.com/print-cost-guide","contact":{"name":"INKFLOW","url":"https://inkflow1st.com"}},"servers":[{"url":"https://inkflow1st.com","description":"INKFLOW 운영 주소"}],"tags":[{"name":"price-table","description":"대표 사양의 부수별 가격표(가격표 페이지와 같은 숫자)."},{"name":"quote","description":"사양을 보내 단건 견적을 받습니다."}],"externalDocs":{"description":"가격표 페이지(사람이 읽는 판 · 정본)","url":"https://inkflow1st.com/print-cost-guide"},"paths":{"/print-cost-guide.json":{"get":{"operationId":"getPrintCostGuide","tags":["price-table"],"summary":"가격표 JSON — 대표 사양의 부수별 온라인 판매가","description":"책 · 프리미엄 명함의 대표 사양을 부수별로 담은 표예요. 가격표 페이지(https://inkflow1st.com/print-cost-guide)와 같은 스냅샷이라 숫자가 항상 같고, 이 요청이 새 계산을 일으키지는 않아요. 한도: IP 당 분당 60회(가격표 페이지 · 글자판 · 이 문서(openapi.json) · API 카탈로그와 함께 셉니다).","responses":{"200":{"description":"가격표.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTable"}}},"headers":{"Cache-Control":{"description":"public, no-cache","schema":{"type":"string"}},"X-Robots-Tag":{"description":"noindex, follow — 이 JSON 이 검색 결과에 따로 뜨지 않게 해요. 정본은 가격표 페이지예요.","schema":{"type":"string"}},"Link":{"description":"rel=\"canonical\" — 정본(가격표 페이지) 주소. rel=\"service-desc\" — 이 OpenAPI 문서 주소.","schema":{"type":"string"}}}},"429":{"description":"요청이 너무 잦아요(IP 당 분당 한도). 본문은 JSON 이 아니라 한 줄 안내 글자예요.","headers":{"Retry-After":{"description":"다시 요청할 때까지 기다릴 초.","schema":{"type":"integer"}}},"content":{"text/html":{"schema":{"type":"string"}}}},"503":{"description":"표를 지금 만들 수 없어요. 확인되지 않은 금액은 싣지 않아요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceTableUnavailable"}}},"headers":{"Retry-After":{"description":"다시 요청할 때까지 기다릴 초(120).","schema":{"type":"integer"}},"Cache-Control":{"description":"no-store","schema":{"type":"string"}}}}}}},"/print-cost-guide/quote":{"get":{"operationId":"getAiQuote","tags":["quote"],"summary":"단건 견적 — 사양을 쿼리로 보내 온라인 판매가를 받기","description":"사양을 쿼리로 보내면 그 사양의 온라인 판매가를 인쇄 방식별로 돌려줘요(책은 가능한 방식 전부 · 명함은 하나). 금액은 주문 화면(/easy)이 같은 사양에 대해 보여 주는 금액과 같은 견적 엔진의 결과예요.\n\n- 상품마다 받는 항목이 달라요(각 파라미터의 x-applies-to · x-required-for). 모르는 항목은 조용히 무시하지 않고 400(UNKNOWN_PARAM)으로 알려 드려요.\n- 요청에 적지 않은 항목은 기본값(예: 코팅 · 후가공 없음)이고, 그 내용은 응답의 assumptions 에 있어요.\n- 이 API 가 받는 사양은 주문 화면이 받는 사양보다 좁아요. 범위 밖은 금액 없이 400(MANUAL_QUOTE)이고, 주문 화면에서는 가능한 사양이 많아요(orderScreen).\n- 한도: IP 당 분당 20회. 같은 사양은 같은 응답을 한동안 재사용해요(기준 시각 = computedAt).\n\n호출 예(주소 뒤에 붙이는 쿼리):\n- product=book&size=A4&binding=perfect&pages=100&color=color&qty=1&paper=%EB%B0%B1%EC%83%89%EB%AA%A8%EC%A1%B0+80g&coating=gloss\n- product=business-card&qty=100&sides=1","parameters":[{"name":"product","in":"query","required":true,"description":"상품. book · business-card 중 하나(항상 필수).","schema":{"type":"string","enum":["book","business-card"]},"x-applies-to":["book","business-card"],"x-required-for":["book","business-card"]},{"name":"size","in":"query","required":false,"description":"책 판형(완성 크기). A4 210×297mm · A5 148×210mm · A6 105×148mm · B5 182×257mm · B6 128×182mm · 신국판 152×225mm · 크라운판 176×248mm · 46판 128×188mm · 46배판 188×257mm · 수첩판 88×128mm · 정사각(210) 210×210mm · 정사각(200) 200×200mm. 적용 상품: book · 필수. 목록에 있어도 인쇄 방식에 따라 금액이 없을 수 있어요(응답의 unavailable).","schema":{"type":"string","enum":["A4","A5","A6","B5","B6","신국판","크라운판","46판","46배판","수첩판","정사각(210)","정사각(200)"]},"x-applies-to":["book"],"x-required-for":["book"]},{"name":"binding","in":"query","required":false,"description":"책 제본. perfect = 무선제본 · saddle = 중철 · twin-ring = 트윈링 · single-ring = 원링. 적용 상품: book · 필수. 날개 제본 · 미싱은 이 API 범위 밖이에요(MANUAL_QUOTE · 주문 화면에서 가능).","schema":{"type":"string","enum":["perfect","saddle","twin-ring","single-ring"]},"x-applies-to":["book"],"x-required-for":["book"]},{"name":"pages","in":"query","required":false,"description":"책 내지 페이지 수. 제본마다 범위가 달라요 — perfect(무선제본) 24~800페이지 · 2의 배수 · saddle(중철) 8~40페이지 · 4의 배수 · twin-ring(트윈링) 2~600페이지 · single-ring(원링) 2~600페이지. 적용 상품: book · 필수. 링 제본은 홀수 페이지도 받고, 제작은 입력한 페이지 수 그대로 · 금액은 다음 짝수 페이지 기준이에요(응답의 pagesNote · pricedPages · producedPages). 범위 밖은 400 이에요.","schema":{"type":"integer","minimum":2,"maximum":800},"x-applies-to":["book"],"x-required-for":["book"],"x-ranges-by-binding":{"perfect":{"minimum":24,"maximum":800,"multipleOf":2},"saddle":{"minimum":8,"maximum":40,"multipleOf":4},"twin-ring":{"minimum":2,"maximum":600},"single-ring":{"minimum":2,"maximum":600}}},{"name":"color","in":"query","required":false,"description":"책 내지 색. bw = 흑백 · color = 컬러. 적용 상품: book · 필수.","schema":{"type":"string","enum":["bw","color"]},"x-applies-to":["book"],"x-required-for":["book"]},{"name":"qty","in":"query","required":true,"description":"부수(명함은 매수). 상품마다 범위가 달라요 — book 1~10,000 · business-card 100~2,000. 항상 필수. 명함은 디자인 1종당 매수예요.","schema":{"type":"integer","minimum":1,"maximum":10000},"x-applies-to":["book","business-card"],"x-required-for":["book","business-card"],"x-ranges-by-product":{"book":{"minimum":1,"maximum":10000},"business-card":{"minimum":100,"maximum":2000}}},{"name":"paper","in":"query","required":false,"description":"책 내지 용지. 생략하면 백색모조 100g. 새 책 주문 화면의 시작 사양은 백색모조 80g(가격표 첫 줄과 같은 금액을 보려면 적어 주세요). 적용 상품: book · 선택.","schema":{"type":"string","enum":["미색모조 80g","미색모조 100g","백색모조 80g","백색모조 100g","백색모조 120g","백색모조 150g","에스플러스 미색 80g","에스플러스 미색 100g","에스플러스 백색 80g","에스플러스 백색 100g","뉴플러스 미색 80g","뉴플러스 미색 100g","뉴플러스 백색 80g","뉴플러스 백색 100g","아트지 100g","아트지 120g","아트지 150g","스노우 100g","스노우 120g","스노우 150g"],"default":"백색모조 100g"},"x-applies-to":["book"],"x-required-for":[]},{"name":"cover","in":"query","required":false,"description":"책 표지 용지. 생략하면 스노우 250g. 적용 상품: book · 선택.","schema":{"type":"string","enum":["스노우 200g","스노우 250g","스노우 300g","아트지 200g","아트지 250g","아트지 300g"],"default":"스노우 250g"},"x-applies-to":["book"],"x-required-for":[]},{"name":"method","in":"query","required":false,"description":"책 인쇄 방식을 하나로 한정해 보고 싶을 때. 생략하면 가능한 방식 전부를 응답해요. 옵셋 인쇄는 500부 이상부터 선택할 수 있어요. 적용 상품: book · 선택.","schema":{"type":"string","enum":["toner","digital-press","indigo","offset"]},"x-applies-to":["book"],"x-required-for":[]},{"name":"coating","in":"query","required":false,"description":"책 표지 코팅(단면). none = 없음 · matte = 무광 · gloss = 유광 · emboss = 엠보. 생략하면 코팅 없음(새 책 주문 화면의 시작 사양은 gloss) — 단, 박 · 에폭시를 고르면 무광 코팅이 함께 들어가요(박 · 에폭시는 무광 코팅 위에만 되고, 무광이 아닌 코팅과 함께 적으면 400). 적용 상품: book · 선택.","schema":{"type":"string","enum":["none","matte","gloss","emboss"]},"x-applies-to":["book"],"x-required-for":[]},{"name":"foil","in":"query","required":false,"description":"책 표지 박. none = 없음 · gold = 금박 · silver = 은박 · hologram = 홀로그램박. 생략하면 박 없음. 적용 상품: book · 선택.","schema":{"type":"string","enum":["none","gold","silver","hologram"]},"x-applies-to":["book"],"x-required-for":[]},{"name":"foilArea","in":"query","required":false,"description":"박을 넣는 면적. cover-text = 표지 제목 · 로고(작은 면적) · cover-full = 표지 전체(넓은 면적). foil 을 함께 적었을 때만 쓸 수 있고, 생략하면 cover-text. 적용 상품: book · 선택.","schema":{"type":"string","enum":["cover-text","cover-full"],"default":"cover-text"},"x-applies-to":["book"],"x-required-for":[]},{"name":"epoxy","in":"query","required":false,"description":"책 표지 에폭시. none = 없음 · text = 글자만 · area = 넓은 면적. 생략하면 에폭시 없음. 적용 상품: book · 선택.","schema":{"type":"string","enum":["none","text","area"]},"x-applies-to":["book"],"x-required-for":[]},{"name":"endpaper","in":"query","required":false,"description":"면지. none = 없음 · 1 = 앞뒤 1장씩 · 2 = 앞뒤 2장씩. 생략하면 면지 없음. 중철 제본에는 면지를 넣지 않아요(400). 적용 상품: book · 선택.","schema":{"type":"string","enum":["none","1","2"]},"x-applies-to":["book"],"x-required-for":[]},{"name":"sides","in":"query","required":false,"description":"명함 인쇄 면. 1 = 단면 · 2 = 양면. 적용 상품: business-card · 필수.","schema":{"type":"integer","enum":[1,2]},"x-applies-to":["business-card"],"x-required-for":["business-card"]}],"responses":{"200":{"description":"견적. 금액이 있는 방식은 options 에 있어요. options 가 비어 있고 unavailable 만 있으면 조회한 방식 모두 이 사양의 자동 견적이 없다는 사실이에요(pending 이 함께 있는 일은 없어요 — 금액이 하나도 없고 확인 중인 방식이 있으면 503).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quote"}}},"headers":{"Cache-Control":{"description":"public, no-cache","schema":{"type":"string"}},"X-Robots-Tag":{"description":"noindex, nofollow — 이 JSON 이 검색 결과에 따로 뜨지 않게 해요. 정본은 가격표 페이지예요.","schema":{"type":"string"}}}},"400":{"description":"입력 오류 또는 이 API 의 자동 견적 범위 밖. 금액은 없어요.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteBadRequest"}}},"headers":{"Cache-Control":{"description":"no-store","schema":{"type":"string"}}}},"429":{"description":"요청이 너무 잦아요(IP 당 분당 한도).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRateLimited"}}},"headers":{"Retry-After":{"description":"다시 요청할 때까지 기다릴 초.","schema":{"type":"integer"}},"Cache-Control":{"description":"no-store","schema":{"type":"string"}}}},"503":{"description":"PRICING_UNAVAILABLE(reason ALL_CHECKING 또는 COMPUTE_ERROR) 또는 SERVER_BUSY. 모두 금액이 없어요. Retry-After 뒤 다시 요청하세요.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/QuotePricingUnavailable"},{"$ref":"#/components/schemas/QuoteServerBusy"}]}}},"headers":{"Retry-After":{"description":"다시 요청할 때까지 기다릴 초(PRICING_UNAVAILABLE 60 · SERVER_BUSY 10).","schema":{"type":"integer"}},"Cache-Control":{"description":"no-store","schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Basis":{"type":"object","required":["priceType","vat","shipping","currency"],"description":"금액의 기준. 온라인 판매가(회원 가입 없이 주문할 때의 금액) · 부가세 포함 · 배송비 별도 · 원(KRW).","properties":{"priceType":{"type":"string","const":"온라인 판매가"},"vat":{"type":"string","const":"included","description":"included = 금액에 부가세가 들어 있어요."},"shipping":{"type":"string","const":"excluded","description":"excluded = 배송비는 금액에 들어 있지 않아요."},"currency":{"type":"string","const":"KRW"}}},"QuoteMethod":{"type":"string","enum":["toner","digital-press","indigo","offset","standard"],"description":"인쇄 방식 id. 책은 방식별로 나오고, 명함은 standard 하나예요."},"PriceTable":{"type":"object","description":"가격표 페이지(/print-cost-guide)와 같은 스냅샷의 JSON. 금액은 totalKrw 정수 그대로예요.","required":["ok","schemaVersion","publisher","canonical","basis","generatedAt","generatedAtKst","validUntil","citation","sections","faqs","notes"],"properties":{"ok":{"type":"boolean","const":true},"schemaVersion":{"type":"integer"},"publisher":{"type":"string"},"canonical":{"type":"string","format":"uri","description":"정본(사람이 읽는 가격표 페이지) 주소."},"basis":{"$ref":"#/components/schemas/Basis"},"generatedAt":{"type":"string","format":"date-time","description":"기준 시각(표를 만든 시각)."},"generatedAtKst":{"type":"string","description":"기준 시각(한국 시간 표기)."},"validUntil":{"type":"string","format":"date-time","description":"이 시각이 지난 금액은 인용하지 말고 다시 요청하세요."},"citation":{"type":"string","description":"인용할 때 그대로 쓸 수 있는 출처 문장(기준 시각 · 주소 포함)."},"sections":{"type":"array","items":{"$ref":"#/components/schemas/PriceSection"}},"faqs":{"type":"array","description":"가격표 페이지의 질문형 문답과 같은 글.","items":{"$ref":"#/components/schemas/PriceFaq"}},"notes":{"type":"array","items":{"type":"string"}}}},"PriceSection":{"type":"object","required":["id","unit","rows"],"properties":{"id":{"type":"string","enum":["books","business-cards","calendars"]},"unit":{"type":"string","description":"부수 단위(부 · 매)."},"rows":{"type":"array","items":{"$ref":"#/components/schemas/PriceRow"}}}},"PriceRow":{"type":"object","required":["id","label","details","cells"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"details":{"type":"string","description":"사양 설명(용지 · 인쇄 방식 등)."},"cells":{"type":"array","items":{"$ref":"#/components/schemas/PriceCell"}}}},"PriceCell":{"description":"부수별 칸. status 가 priced 이면 금액이 있고, pending(기준 단가 확인 중) · unavailable(그 사양과 부수는 자동 견적 없음)이면 금액이 없어요.","oneOf":[{"type":"object","required":["qty","status","totalKrw"],"properties":{"qty":{"type":"integer"},"status":{"type":"string","const":"priced"},"totalKrw":{"type":"integer","minimum":1,"description":"온라인 판매가(부가세 포함 · 배송비 별도 · 원)."}}},{"type":"object","required":["qty","status"],"properties":{"qty":{"type":"integer"},"status":{"type":"string","enum":["pending","unavailable"]}}}]},"PriceFaq":{"type":"object","required":["question","answer","rowId","qty"],"properties":{"question":{"type":"string"},"answer":{"type":"string","description":"첫 문장에 기준 시각 · 금액이 있어요."},"rowId":{"type":"string"},"qty":{"type":"integer"}}},"PriceTableUnavailable":{"type":"object","required":["ok","code","retryAfter"],"description":"표를 만들 수 없을 때(숫자를 싣지 않는다).","properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string","const":"PRICE_TABLE_UNAVAILABLE"},"retryAfter":{"type":"integer","description":"다시 요청할 때까지 기다릴 초."}}},"Quote":{"type":"object","description":"단건 견적. 금액이 있는 방식은 options, 금액이 없는 방식은 unavailable · pending 에 있어요.","required":["ok","schemaVersion","product","spec","assumptions","basis","computedAt","computedAtKst","validUntil","options","unavailable","pending","orderUrl","guideUrl","citation","notes"],"properties":{"ok":{"type":"boolean","const":true},"schemaVersion":{"type":"integer","const":1},"product":{"type":"string","enum":["book","business-card"]},"spec":{"description":"정식 표기로 접은 사양.","oneOf":[{"$ref":"#/components/schemas/BookSpec"},{"$ref":"#/components/schemas/BusinessCardSpec"}]},"assumptions":{"type":"array","items":{"type":"string"},"description":"말하지 않은 기본값(예: 코팅 · 후가공 없음). 금액은 이 기본값 그대로의 금액이에요."},"basis":{"$ref":"#/components/schemas/Basis"},"computedAt":{"type":"string","format":"date-time","description":"기준 시각. 캐시된 응답이면 처음 계산한 시각이에요."},"computedAtKst":{"type":"string","description":"기준 시각(한국 시간 표기)."},"validUntil":{"type":"string","format":"date-time","description":"이 시각이 지난 금액은 인용하지 말고 다시 요청하세요."},"options":{"type":"array","items":{"$ref":"#/components/schemas/QuoteOption"},"description":"금액이 있는 방식(금액 오름차순). 비어 있고 pending 도 비어 있으면(unavailable 만 있는 200) 조회한 방식 모두 이 사양의 자동 견적이 없다는 사실이에요."},"unavailable":{"type":"array","items":{"$ref":"#/components/schemas/QuoteUnavailable"},"description":"그 방식으로는 자동 견적이 없는 사양이라는 **사실**(그 방식의 판형 · 페이지 수 · 부수 · 용지 · 제본 범위 밖이거나, 견적 엔진이 자동 견적 대상으로 보지 않는 사양). 금액이 없을 뿐 일시적인 상태가 아니에요."},"pending":{"type":"array","items":{"$ref":"#/components/schemas/QuotePending"},"description":"기준 단가를 아직 확인하지 못해 금액을 싣지 않은 방식 — **자동 견적이 없다는 뜻이 아니라 일시적인 상태**예요. 잠시 뒤 다시 요청하거나 orderUrl 에서 확인하세요."},"orderUrl":{"type":"string","format":"uri","description":"같은 사양이 채워진 주문 화면 주소. 최종 금액은 파일 · 사양 확인 뒤 이 화면에서 확정돼요."},"guideUrl":{"type":"string","format":"uri","description":"가격표 페이지 주소."},"citation":{"type":"string","description":"인용할 때 그대로 쓸 수 있는 출처 문장(기준 시각 포함)."},"notes":{"type":"array","items":{"type":"string"}}}},"BookSpec":{"type":"object","required":["size","sizeMm","binding","pages","color","qty","paper","cover"],"description":"책 사양 — 요청을 정식 표기로 접은 값(같은 사양은 표기가 달라도 같다).","additionalProperties":false,"properties":{"size":{"type":"string","enum":["A4","A5","A6","B5","B6","신국판","크라운판","46판","46배판","수첩판","정사각(210)","정사각(200)"]},"sizeMm":{"type":"array","description":"[가로, 세로] mm","prefixItems":[{"type":"integer"},{"type":"integer"}],"minItems":2,"maxItems":2},"binding":{"type":"string","enum":["perfect","saddle","twin-ring","single-ring"]},"pages":{"type":"integer"},"color":{"type":"string","enum":["bw","color"]},"qty":{"type":"integer"},"paper":{"type":"string","enum":["미색모조 80g","미색모조 100g","백색모조 80g","백색모조 100g","백색모조 120g","백색모조 150g","에스플러스 미색 80g","에스플러스 미색 100g","에스플러스 백색 80g","에스플러스 백색 100g","뉴플러스 미색 80g","뉴플러스 미색 100g","뉴플러스 백색 80g","뉴플러스 백색 100g","아트지 100g","아트지 120g","아트지 150g","스노우 100g","스노우 120g","스노우 150g"]},"cover":{"type":"string","enum":["스노우 200g","스노우 250g","스노우 300g","아트지 200g","아트지 250g","아트지 300g"]},"method":{"type":"string","enum":["toner","digital-press","indigo","offset"],"description":"요청에서 방식을 한정했을 때만 있어요."},"coating":{"type":"string","enum":["matte","gloss","emboss"],"description":"표지 코팅(단면) — 고른 경우만 있어요. 박 · 에폭시를 골랐으면 matte."},"foil":{"type":"string","enum":["gold","silver","hologram"],"description":"표지 박 — 고른 경우만 있어요."},"foilArea":{"type":"string","enum":["cover-text","cover-full"],"description":"박 면적 — foil 이 있을 때만 있어요."},"epoxy":{"type":"string","enum":["text","area"],"description":"표지 에폭시 — 고른 경우만 있어요."},"endpaper":{"type":"integer","enum":[1,2],"description":"면지 앞뒤 장수(앞 · 뒤 같은 장수) — 고른 경우만 있어요."}}},"BusinessCardSpec":{"type":"object","required":["qty","sides","label"],"additionalProperties":false,"description":"명함 사양.","properties":{"qty":{"type":"integer"},"sides":{"type":"integer","enum":[1,2]},"label":{"type":"string"}}},"QuoteOption":{"type":"object","required":["method","methodLabel","totalKrw","supplyKrw"],"properties":{"method":{"$ref":"#/components/schemas/QuoteMethod"},"methodLabel":{"type":"string","description":"방식 이름(사람이 읽는 표기)."},"totalKrw":{"type":"integer","minimum":1,"description":"온라인 판매가 — 부가세 포함 · 배송비 별도 · 원(KRW). 인용할 금액은 이 값이에요."},"supplyKrw":{"type":"integer","minimum":1,"description":"부가세를 포함하지 않은 판매 금액. 주문 화면에서 명함의 처음 보이는 금액이 이 기준이에요."},"pagesNote":{"type":"string","description":"홀수 페이지 링 제본일 때만 — 제작 페이지 수와 금액 기준 페이지 수가 다르다는 설명."},"pricedPages":{"type":"integer","description":"홀수 페이지 링 제본일 때만 — 금액 기준 페이지 수."},"producedPages":{"type":["integer","null"],"description":"홀수 페이지 링 제본일 때만 — 제작 페이지 수(입력한 페이지 수)."}}},"QuoteUnavailable":{"type":"object","required":["method","methodLabel","code","message"],"properties":{"method":{"$ref":"#/components/schemas/QuoteMethod"},"methodLabel":{"type":"string","description":"방식 이름(사람이 읽는 표기)."},"code":{"type":"string","enum":["SIZE_NOT_SUPPORTED","PAGES_NOT_SUPPORTED","QTY_NOT_SUPPORTED","PAPER_NOT_SUPPORTED","BINDING_NOT_SUPPORTED","FINISH_NOT_SUPPORTED","NO_AUTO_QUOTE"],"description":"왜 자동 견적이 없는지(범위 밖의 항목 또는 NO_AUTO_QUOTE)."},"message":{"type":"string"}}},"QuotePending":{"type":"object","required":["method","methodLabel","code","message"],"properties":{"method":{"$ref":"#/components/schemas/QuoteMethod"},"methodLabel":{"type":"string","description":"방식 이름(사람이 읽는 표기)."},"code":{"type":"string","const":"CHECKING","description":"기준 단가 확인 중."},"message":{"type":"string"}}},"QuoteBadRequest":{"type":"object","required":["ok","code","field","reason","message"],"description":"입력 오류 · 자동 견적 범위 밖. 금액은 없어요. reason 의 뜻:\n- INVALID_PARAM · MISSING: 꼭 적어야 하는 항목이 빠졌어요.\n- INVALID_PARAM · DUPLICATE: 같은 항목을 두 번 적었어요.\n- INVALID_PARAM · FORMAT: 값의 모양이 맞지 않아요(정수 자리에 글자 · 너무 긴 값 등).\n- INVALID_PARAM · TOO_LONG: 주소(쿼리)가 너무 길거나 항목이 너무 많아요.\n- INVALID_PARAM · NOT_OFFERED: 안내된 값 목록에 없는 값이에요.\n- INVALID_PARAM · MULTIPLE: 판형을 여러 개 적었어요.\n- INVALID_PARAM · AMBIGUOUS_NAME: 판형마다 크기가 달라 이름만으로 정할 수 없어요 — 가로×세로(mm)로 적어 주세요.\n- INVALID_PARAM · BLEED_SIZE: 도련이 더해진 파일 크기로 보여요 — 완성(재단) 크기로 적어 주세요.\n- INVALID_PARAM · OUT_OF_RANGE: 허용 범위 밖이에요(페이지 수 · 부수 · 매수). allowed 에 범위가 있어요.\n- INVALID_PARAM · OFFSET_QTY: 옵셋 방식은 일정 부수 이상부터 고를 수 있어요(method 설명 참고).\n- UNKNOWN_PARAM · UNKNOWN: 알 수 없는 항목 이름이에요. allowed 에 이 상품이 받는 항목이 있어요.\n- MANUAL_QUOTE · NOT_IN_V1: 이 API 가 아직 받지 않는 판형 · 제본이에요(날개 제본 · 미싱 · 목록 밖 판형). 주문 화면에서는 고를 수 있어요.\n- MANUAL_QUOTE · ABOVE_LIMIT: 이 API 의 책 부수 상한을 넘었어요. 주문 화면에서 확인해 주세요.\n- MANUAL_QUOTE · ABOVE_AUTO_QUOTE: 자동 견적 페이지 수 상한을 넘은 책이에요. 담당자가 금액을 안내해요.\n- MANUAL_QUOTE · LARGE_BOOK_OFFSET: A3 · B4처럼 A4보다 큰 책이에요. 옵셋 인쇄(무선제본 · 날개무선 · 미싱제본 · 500부부터)로만 만들어요 — 1:1 문의로 견적을 받아요.","properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string","enum":["INVALID_PARAM","UNKNOWN_PARAM","MANUAL_QUOTE"]},"field":{"type":"string","description":"문제가 된 항목 이름(알아볼 수 없는 이름은 (unreadable))."},"reason":{"type":"string","enum":["MISSING","DUPLICATE","FORMAT","TOO_LONG","NOT_OFFERED","MULTIPLE","AMBIGUOUS_NAME","BLEED_SIZE","OUT_OF_RANGE","OFFSET_QTY","UNKNOWN","NOT_IN_V1","ABOVE_LIMIT","ABOVE_AUTO_QUOTE","LARGE_BOOK_OFFSET"]},"message":{"type":"string"},"allowed":{"description":"허용 값 목록 또는 범위.","oneOf":[{"type":"array","items":{"type":["string","integer"]}},{"type":"object","properties":{"min":{"type":"integer"},"max":{"type":["integer","null"]},"multipleOf":{"type":["integer","null"]}}}]},"contact":{"type":"string","format":"uri","description":"MANUAL_QUOTE 일 때 — 담당자 상담 주소."},"orderScreen":{"type":"string","format":"uri","description":"주문 화면이 이 사양을 받는 경우의 주소(자동 견적 범위 밖)."}}},"QuoteRateLimited":{"type":"object","required":["ok","code","message","retryAfter"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string","const":"RATE_LIMITED"},"message":{"type":"string"},"retryAfter":{"type":"integer","description":"다시 요청할 때까지 기다릴 초."}}},"QuotePricingUnavailable":{"type":"object","required":["ok","code","reason","message","retryAfter"],"description":"숫자를 싣지 못하는 503. reason 으로 구분해요 — ALL_CHECKING(모든 방식이 기준 단가 확인 중 · 일시적 · 금액 없음이 아님 · orderUrl 에서 확인) · COMPUTE_ERROR(계산 오류 · 잠시 뒤 다시).","properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string","const":"PRICING_UNAVAILABLE"},"reason":{"type":"string","enum":["ALL_CHECKING","COMPUTE_ERROR"]},"message":{"type":"string"},"orderUrl":{"type":"string","format":"uri","description":"ALL_CHECKING 일 때만 — 같은 사양이 채워진 주문 화면 주소."},"retryAfter":{"type":"integer","description":"다시 요청할 때까지 기다릴 초(Retry-After 헤더와 같다)."}}},"QuoteServerBusy":{"type":"object","required":["ok","code","message","retryAfter"],"description":"요청이 많아 새 계산을 하지 못함(숫자 없음). 같은 사양을 이미 계산해 둔 응답은 계속 나가요.","properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string","const":"SERVER_BUSY"},"message":{"type":"string"},"retryAfter":{"type":"integer"}}}}}}