@cmarket/partner-sdk 39.0.0 → 40.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (878) hide show
  1. package/README.md +9 -6
  2. package/api/embed-api.ts +10 -10
  3. package/api/oauth-api.ts +18 -18
  4. package/api/partner-api-api.ts +334 -334
  5. package/api/products-api.ts +22 -22
  6. package/api/webhooks-api.ts +78 -78
  7. package/api/well-known-api.ts +10 -10
  8. package/api.ts +2 -2
  9. package/base.ts +2 -2
  10. package/common.ts +2 -2
  11. package/configuration.ts +2 -2
  12. package/dist/api/embed-api.d.ts +10 -10
  13. package/dist/api/embed-api.js +10 -10
  14. package/dist/api/oauth-api.d.ts +18 -18
  15. package/dist/api/oauth-api.js +18 -18
  16. package/dist/api/partner-api-api.d.ts +334 -334
  17. package/dist/api/partner-api-api.js +334 -334
  18. package/dist/api/products-api.d.ts +22 -22
  19. package/dist/api/products-api.js +22 -22
  20. package/dist/api/webhooks-api.d.ts +78 -78
  21. package/dist/api/webhooks-api.js +78 -78
  22. package/dist/api/well-known-api.d.ts +10 -10
  23. package/dist/api/well-known-api.js +10 -10
  24. package/dist/api.d.ts +2 -2
  25. package/dist/api.js +2 -2
  26. package/dist/base.d.ts +2 -2
  27. package/dist/base.js +2 -2
  28. package/dist/common.d.ts +2 -2
  29. package/dist/common.js +2 -2
  30. package/dist/configuration.d.ts +2 -2
  31. package/dist/configuration.js +2 -2
  32. package/dist/esm/api/embed-api.d.ts +10 -10
  33. package/dist/esm/api/embed-api.js +10 -10
  34. package/dist/esm/api/oauth-api.d.ts +18 -18
  35. package/dist/esm/api/oauth-api.js +18 -18
  36. package/dist/esm/api/partner-api-api.d.ts +334 -334
  37. package/dist/esm/api/partner-api-api.js +334 -334
  38. package/dist/esm/api/products-api.d.ts +22 -22
  39. package/dist/esm/api/products-api.js +22 -22
  40. package/dist/esm/api/webhooks-api.d.ts +78 -78
  41. package/dist/esm/api/webhooks-api.js +78 -78
  42. package/dist/esm/api/well-known-api.d.ts +10 -10
  43. package/dist/esm/api/well-known-api.js +10 -10
  44. package/dist/esm/api.d.ts +2 -2
  45. package/dist/esm/api.js +2 -2
  46. package/dist/esm/base.d.ts +2 -2
  47. package/dist/esm/base.js +2 -2
  48. package/dist/esm/common.d.ts +2 -2
  49. package/dist/esm/common.js +2 -2
  50. package/dist/esm/configuration.d.ts +2 -2
  51. package/dist/esm/configuration.js +2 -2
  52. package/dist/esm/index.d.ts +2 -2
  53. package/dist/esm/index.js +2 -2
  54. package/dist/esm/models/acceptance-result-response-dto.d.ts +2 -2
  55. package/dist/esm/models/acceptance-result-response-dto.js +2 -2
  56. package/dist/esm/models/acknowledge-product-receipt200-response.d.ts +2 -2
  57. package/dist/esm/models/acknowledge-product-receipt200-response.js +2 -2
  58. package/dist/esm/models/acknowledge-products-request-dto.d.ts +3 -3
  59. package/dist/esm/models/acknowledge-products-request-dto.js +2 -2
  60. package/dist/esm/models/api-catalog-dto.d.ts +2 -2
  61. package/dist/esm/models/api-catalog-dto.js +2 -2
  62. package/dist/esm/models/api-catalog-entry-dto.d.ts +4 -4
  63. package/dist/esm/models/api-catalog-entry-dto.js +2 -2
  64. package/dist/esm/models/api-catalog-link-dto.d.ts +2 -2
  65. package/dist/esm/models/api-catalog-link-dto.js +2 -2
  66. package/dist/esm/models/authorization-server-metadata-dto.d.ts +6 -6
  67. package/dist/esm/models/authorization-server-metadata-dto.js +2 -2
  68. package/dist/esm/models/award-method-public.d.ts +2 -2
  69. package/dist/esm/models/award-method-public.js +2 -2
  70. package/dist/esm/models/award-registered-v2-response-dto.d.ts +3 -3
  71. package/dist/esm/models/award-registered-v2-response-dto.js +2 -2
  72. package/dist/esm/models/award-reverted-v2-response-dto.d.ts +3 -3
  73. package/dist/esm/models/award-reverted-v2-response-dto.js +2 -2
  74. package/dist/esm/models/bid-acceptance-dto.d.ts +2 -2
  75. package/dist/esm/models/bid-acceptance-dto.js +2 -2
  76. package/dist/esm/models/bid-attachment-input-dto.d.ts +6 -6
  77. package/dist/esm/models/bid-attachment-input-dto.js +2 -2
  78. package/dist/esm/models/bid-bond-dto.d.ts +2 -2
  79. package/dist/esm/models/bid-bond-dto.js +2 -2
  80. package/dist/esm/models/bid-cancelled-response-dto.d.ts +3 -3
  81. package/dist/esm/models/bid-cancelled-response-dto.js +2 -2
  82. package/dist/esm/models/bid-contact-dto.d.ts +2 -2
  83. package/dist/esm/models/bid-contact-dto.js +2 -2
  84. package/dist/esm/models/bid-contacts-dto.d.ts +2 -2
  85. package/dist/esm/models/bid-contacts-dto.js +2 -2
  86. package/dist/esm/models/bid-contract-document-dto.d.ts +9 -9
  87. package/dist/esm/models/bid-contract-document-dto.js +2 -2
  88. package/dist/esm/models/bid-delivery-terms-dto.d.ts +2 -2
  89. package/dist/esm/models/bid-delivery-terms-dto.js +2 -2
  90. package/dist/esm/models/bid-detail-response-dto.d.ts +5 -5
  91. package/dist/esm/models/bid-detail-response-dto.js +2 -2
  92. package/dist/esm/models/bid-document-dto.d.ts +2 -2
  93. package/dist/esm/models/bid-document-dto.js +2 -2
  94. package/dist/esm/models/bid-failed-v2-response-dto.d.ts +3 -3
  95. package/dist/esm/models/bid-failed-v2-response-dto.js +2 -2
  96. package/dist/esm/models/bid-item-dto.d.ts +2 -2
  97. package/dist/esm/models/bid-item-dto.js +2 -2
  98. package/dist/esm/models/bid-lifecycle-dto.d.ts +2 -2
  99. package/dist/esm/models/bid-lifecycle-dto.js +2 -2
  100. package/dist/esm/models/bid-manager-dto.d.ts +2 -2
  101. package/dist/esm/models/bid-manager-dto.js +2 -2
  102. package/dist/esm/models/bid-payment-terms-dto.d.ts +2 -2
  103. package/dist/esm/models/bid-payment-terms-dto.js +2 -2
  104. package/dist/esm/models/bid-product-dto.d.ts +2 -2
  105. package/dist/esm/models/bid-product-dto.js +2 -2
  106. package/dist/esm/models/bid-public-status.d.ts +2 -2
  107. package/dist/esm/models/bid-public-status.js +2 -2
  108. package/dist/esm/models/bid-registered-response-dto.d.ts +3 -3
  109. package/dist/esm/models/bid-registered-response-dto.js +2 -2
  110. package/dist/esm/models/bid-result-participant-attachment-dto.d.ts +3 -3
  111. package/dist/esm/models/bid-result-participant-attachment-dto.js +2 -2
  112. package/dist/esm/models/bid-result-participant-dto.d.ts +3 -3
  113. package/dist/esm/models/bid-result-participant-dto.js +2 -2
  114. package/dist/esm/models/bid-results-response-dto.d.ts +5 -5
  115. package/dist/esm/models/bid-results-response-dto.js +2 -2
  116. package/dist/esm/models/bid-settlement-line-item-dto.d.ts +2 -2
  117. package/dist/esm/models/bid-settlement-line-item-dto.js +2 -2
  118. package/dist/esm/models/bid-settlement-participant-dto.d.ts +2 -2
  119. package/dist/esm/models/bid-settlement-participant-dto.js +2 -2
  120. package/dist/esm/models/bid-settlement-response-dto.d.ts +2 -2
  121. package/dist/esm/models/bid-settlement-response-dto.js +2 -2
  122. package/dist/esm/models/bid-statement-response-dto.d.ts +2 -2
  123. package/dist/esm/models/bid-statement-response-dto.js +2 -2
  124. package/dist/esm/models/bid-summary-dto.d.ts +3 -3
  125. package/dist/esm/models/bid-summary-dto.js +2 -2
  126. package/dist/esm/models/bid-type-public.d.ts +2 -2
  127. package/dist/esm/models/bid-type-public.js +2 -2
  128. package/dist/esm/models/bid-updated-response-dto.d.ts +2 -2
  129. package/dist/esm/models/bid-updated-response-dto.js +2 -2
  130. package/dist/esm/models/cancel-bid-request-dto.d.ts +2 -2
  131. package/dist/esm/models/cancel-bid-request-dto.js +2 -2
  132. package/dist/esm/models/cancel-bid200-response.d.ts +2 -2
  133. package/dist/esm/models/cancel-bid200-response.js +2 -2
  134. package/dist/esm/models/card-payment-request-response-dto.d.ts +2 -2
  135. package/dist/esm/models/card-payment-request-response-dto.js +2 -2
  136. package/dist/esm/models/complete-acceptance-request-dto.d.ts +4 -4
  137. package/dist/esm/models/complete-acceptance-request-dto.js +2 -2
  138. package/dist/esm/models/complete-acceptance200-response.d.ts +2 -2
  139. package/dist/esm/models/complete-acceptance200-response.js +2 -2
  140. package/dist/esm/models/complete-invoice200-response.d.ts +2 -2
  141. package/dist/esm/models/complete-invoice200-response.js +2 -2
  142. package/dist/esm/models/complete-upload-request-dto.d.ts +2 -2
  143. package/dist/esm/models/complete-upload-request-dto.js +2 -2
  144. package/dist/esm/models/contract-restriction-confirm-input-dto.d.ts +3 -3
  145. package/dist/esm/models/contract-restriction-confirm-input-dto.js +2 -2
  146. package/dist/esm/models/create-bid-request-dto.d.ts +5 -5
  147. package/dist/esm/models/create-bid-request-dto.js +2 -2
  148. package/dist/esm/models/create-card-payment-dto.d.ts +2 -2
  149. package/dist/esm/models/create-card-payment-dto.js +2 -2
  150. package/dist/esm/models/create-card-payment-request-dto.d.ts +2 -2
  151. package/dist/esm/models/create-card-payment-request-dto.js +2 -2
  152. package/dist/esm/models/create-card-payment200-response.d.ts +2 -2
  153. package/dist/esm/models/create-card-payment200-response.js +2 -2
  154. package/dist/esm/models/create-embed-launch201-response.d.ts +2 -2
  155. package/dist/esm/models/create-embed-launch201-response.js +2 -2
  156. package/dist/esm/models/create-external-contract-documents-request-dto.d.ts +4 -4
  157. package/dist/esm/models/create-external-contract-documents-request-dto.js +2 -2
  158. package/dist/esm/models/create-external-contract-documents-response-dto.d.ts +2 -2
  159. package/dist/esm/models/create-external-contract-documents-response-dto.js +2 -2
  160. package/dist/esm/models/create-file-upload-url201-response.d.ts +2 -2
  161. package/dist/esm/models/create-file-upload-url201-response.js +2 -2
  162. package/dist/esm/models/create-upload-url-request-dto.d.ts +2 -2
  163. package/dist/esm/models/create-upload-url-request-dto.js +2 -2
  164. package/dist/esm/models/create-webhook-endpoint-request-dto.d.ts +4 -4
  165. package/dist/esm/models/create-webhook-endpoint-request-dto.js +2 -2
  166. package/dist/esm/models/create-webhook-endpoint201-response.d.ts +2 -2
  167. package/dist/esm/models/create-webhook-endpoint201-response.js +2 -2
  168. package/dist/esm/models/delivery-date-type-public.d.ts +2 -2
  169. package/dist/esm/models/delivery-date-type-public.js +2 -2
  170. package/dist/esm/models/delivery-method-public.d.ts +2 -2
  171. package/dist/esm/models/delivery-method-public.js +2 -2
  172. package/dist/esm/models/embed-bid-prefill-dto.d.ts +83 -0
  173. package/dist/esm/models/embed-bid-prefill-dto.js +23 -0
  174. package/dist/esm/models/embed-bid-prefill-item-dto.d.ts +33 -0
  175. package/dist/esm/models/embed-bid-prefill-item-dto.js +14 -0
  176. package/dist/esm/models/embed-bid-prefill-manager-dto.d.ts +25 -0
  177. package/dist/esm/models/embed-bid-prefill-manager-dto.js +14 -0
  178. package/dist/esm/models/embed-launch-request-dto.d.ts +10 -9
  179. package/dist/esm/models/embed-launch-request-dto.js +2 -2
  180. package/dist/esm/models/embed-launch-response-dto.d.ts +4 -4
  181. package/dist/esm/models/embed-launch-response-dto.js +2 -2
  182. package/dist/esm/models/excellent-procurement-public.d.ts +2 -2
  183. package/dist/esm/models/excellent-procurement-public.js +2 -2
  184. package/dist/esm/models/external-contract-document-item-dto.d.ts +3 -3
  185. package/dist/esm/models/external-contract-document-item-dto.js +2 -2
  186. package/dist/esm/models/external-contract-documents-response-dto.d.ts +2 -2
  187. package/dist/esm/models/external-contract-documents-response-dto.js +2 -2
  188. package/dist/esm/models/external-contract-item-dto.d.ts +2 -2
  189. package/dist/esm/models/external-contract-item-dto.js +2 -2
  190. package/dist/esm/models/external-contract-snapshot-dto.d.ts +5 -5
  191. package/dist/esm/models/external-contract-snapshot-dto.js +2 -2
  192. package/dist/esm/models/external-document-inputs-dto.d.ts +2 -2
  193. package/dist/esm/models/external-document-inputs-dto.js +2 -2
  194. package/dist/esm/models/file-meta-response-dto.d.ts +2 -2
  195. package/dist/esm/models/file-meta-response-dto.js +2 -2
  196. package/dist/esm/models/file-uploaded-response-dto.d.ts +2 -2
  197. package/dist/esm/models/file-uploaded-response-dto.js +2 -2
  198. package/dist/esm/models/generated-external-contract-document-dto.d.ts +4 -4
  199. package/dist/esm/models/generated-external-contract-document-dto.js +2 -2
  200. package/dist/esm/models/get-bid-settlement200-response.d.ts +2 -2
  201. package/dist/esm/models/get-bid-settlement200-response.js +2 -2
  202. package/dist/esm/models/get-bid-statement200-response.d.ts +2 -2
  203. package/dist/esm/models/get-bid-statement200-response.js +2 -2
  204. package/dist/esm/models/get-bid200-response.d.ts +2 -2
  205. package/dist/esm/models/get-bid200-response.js +2 -2
  206. package/dist/esm/models/get-file-meta200-response.d.ts +2 -2
  207. package/dist/esm/models/get-file-meta200-response.js +2 -2
  208. package/dist/esm/models/get-supplier-card-payable-v2200-response.d.ts +2 -2
  209. package/dist/esm/models/get-supplier-card-payable-v2200-response.js +2 -2
  210. package/dist/esm/models/get-webhook-endpoint200-response.d.ts +2 -2
  211. package/dist/esm/models/get-webhook-endpoint200-response.js +2 -2
  212. package/dist/esm/models/green-product-public.d.ts +2 -2
  213. package/dist/esm/models/green-product-public.js +2 -2
  214. package/dist/esm/models/health-controller-check200-response.d.ts +2 -2
  215. package/dist/esm/models/health-controller-check200-response.js +2 -2
  216. package/dist/esm/models/health-response-dto.d.ts +2 -2
  217. package/dist/esm/models/health-response-dto.js +2 -2
  218. package/dist/esm/models/hierarchical-region-dto.d.ts +2 -2
  219. package/dist/esm/models/hierarchical-region-dto.js +2 -2
  220. package/dist/esm/models/index.d.ts +3 -0
  221. package/dist/esm/models/index.js +3 -0
  222. package/dist/esm/models/introspect-request-dto.d.ts +5 -5
  223. package/dist/esm/models/introspect-request-dto.js +2 -2
  224. package/dist/esm/models/introspection-response-dto.d.ts +4 -4
  225. package/dist/esm/models/introspection-response-dto.js +2 -2
  226. package/dist/esm/models/invalid-param-dto.d.ts +2 -2
  227. package/dist/esm/models/invalid-param-dto.js +2 -2
  228. package/dist/esm/models/invoice-completed-response-dto.d.ts +2 -2
  229. package/dist/esm/models/invoice-completed-response-dto.js +2 -2
  230. package/dist/esm/models/invoice-split-response-dto.d.ts +2 -2
  231. package/dist/esm/models/invoice-split-response-dto.js +2 -2
  232. package/dist/esm/models/legal-mandatory-public.d.ts +2 -2
  233. package/dist/esm/models/legal-mandatory-public.js +2 -2
  234. package/dist/esm/models/list-bid-results200-response.d.ts +2 -2
  235. package/dist/esm/models/list-bid-results200-response.js +2 -2
  236. package/dist/esm/models/list-bids200-response-meta.d.ts +3 -3
  237. package/dist/esm/models/list-bids200-response-meta.js +2 -2
  238. package/dist/esm/models/list-bids200-response.d.ts +2 -2
  239. package/dist/esm/models/list-bids200-response.js +2 -2
  240. package/dist/esm/models/list-products200-response.d.ts +2 -2
  241. package/dist/esm/models/list-products200-response.js +2 -2
  242. package/dist/esm/models/list-webhook-deliveries-response-dto.d.ts +3 -3
  243. package/dist/esm/models/list-webhook-deliveries-response-dto.js +2 -2
  244. package/dist/esm/models/list-webhook-deliveries200-response.d.ts +2 -2
  245. package/dist/esm/models/list-webhook-deliveries200-response.js +2 -2
  246. package/dist/esm/models/list-webhook-endpoints200-response.d.ts +2 -2
  247. package/dist/esm/models/list-webhook-endpoints200-response.js +2 -2
  248. package/dist/esm/models/mark-bid-failed-request-dto.d.ts +2 -2
  249. package/dist/esm/models/mark-bid-failed-request-dto.js +2 -2
  250. package/dist/esm/models/mark-bid-failed201-response.d.ts +2 -2
  251. package/dist/esm/models/mark-bid-failed201-response.js +2 -2
  252. package/dist/esm/models/negotiation-score-dto.d.ts +2 -2
  253. package/dist/esm/models/negotiation-score-dto.js +2 -2
  254. package/dist/esm/models/negotiation-scored-v2-response-dto.d.ts +3 -3
  255. package/dist/esm/models/negotiation-scored-v2-response-dto.js +2 -2
  256. package/dist/esm/models/oauth-error-response-dto.d.ts +2 -2
  257. package/dist/esm/models/oauth-error-response-dto.js +2 -2
  258. package/dist/esm/models/on-bid-award-reverted-request.d.ts +2 -2
  259. package/dist/esm/models/on-bid-award-reverted-request.js +2 -2
  260. package/dist/esm/models/on-bid-awarded-request.d.ts +2 -2
  261. package/dist/esm/models/on-bid-awarded-request.js +2 -2
  262. package/dist/esm/models/on-bid-canceled-request.d.ts +2 -2
  263. package/dist/esm/models/on-bid-canceled-request.js +2 -2
  264. package/dist/esm/models/on-bid-closed-request.d.ts +2 -2
  265. package/dist/esm/models/on-bid-closed-request.js +2 -2
  266. package/dist/esm/models/on-bid-failed-request.d.ts +2 -2
  267. package/dist/esm/models/on-bid-failed-request.js +2 -2
  268. package/dist/esm/models/on-ping-request.d.ts +2 -2
  269. package/dist/esm/models/on-ping-request.js +2 -2
  270. package/dist/esm/models/partner-webhook-delivery-status.d.ts +2 -2
  271. package/dist/esm/models/partner-webhook-delivery-status.js +2 -2
  272. package/dist/esm/models/partner-webhook-endpoint-status.d.ts +3 -3
  273. package/dist/esm/models/partner-webhook-endpoint-status.js +3 -3
  274. package/dist/esm/models/partner-webhook-event-type.d.ts +2 -2
  275. package/dist/esm/models/partner-webhook-event-type.js +2 -2
  276. package/dist/esm/models/payment-method-public.d.ts +2 -2
  277. package/dist/esm/models/payment-method-public.js +2 -2
  278. package/dist/esm/models/preconditions-dto.d.ts +2 -2
  279. package/dist/esm/models/preconditions-dto.js +2 -2
  280. package/dist/esm/models/problem-details-dto.d.ts +3 -3
  281. package/dist/esm/models/problem-details-dto.js +2 -2
  282. package/dist/esm/models/product-receipt-response-dto.d.ts +2 -2
  283. package/dist/esm/models/product-receipt-response-dto.js +2 -2
  284. package/dist/esm/models/product-response-dto.d.ts +3 -3
  285. package/dist/esm/models/product-response-dto.js +2 -2
  286. package/dist/esm/models/protected-resource-metadata-dto.d.ts +6 -6
  287. package/dist/esm/models/protected-resource-metadata-dto.js +2 -2
  288. package/dist/esm/models/register-award-request-dto.d.ts +5 -5
  289. package/dist/esm/models/register-award-request-dto.js +2 -2
  290. package/dist/esm/models/register-award201-response.d.ts +2 -2
  291. package/dist/esm/models/register-award201-response.js +2 -2
  292. package/dist/esm/models/register-bid201-response.d.ts +2 -2
  293. package/dist/esm/models/register-bid201-response.js +2 -2
  294. package/dist/esm/models/register-semo-contract-request-dto.d.ts +5 -5
  295. package/dist/esm/models/register-semo-contract-request-dto.js +2 -2
  296. package/dist/esm/models/request-invoice-split-request-dto.d.ts +4 -4
  297. package/dist/esm/models/request-invoice-split-request-dto.js +2 -2
  298. package/dist/esm/models/request-invoice-split200-response.d.ts +2 -2
  299. package/dist/esm/models/request-invoice-split200-response.js +2 -2
  300. package/dist/esm/models/retiree-roster-input-dto.d.ts +2 -2
  301. package/dist/esm/models/retiree-roster-input-dto.js +2 -2
  302. package/dist/esm/models/retiree-roster-row-dto.d.ts +2 -2
  303. package/dist/esm/models/retiree-roster-row-dto.js +2 -2
  304. package/dist/esm/models/revert-award-request-dto.d.ts +2 -2
  305. package/dist/esm/models/revert-award-request-dto.js +2 -2
  306. package/dist/esm/models/revert-award200-response.d.ts +2 -2
  307. package/dist/esm/models/revert-award200-response.js +2 -2
  308. package/dist/esm/models/revoke-request-dto.d.ts +5 -5
  309. package/dist/esm/models/revoke-request-dto.js +2 -2
  310. package/dist/esm/models/semo-contract-registered-response-dto.d.ts +3 -3
  311. package/dist/esm/models/semo-contract-registered-response-dto.js +2 -2
  312. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.d.ts +2 -2
  313. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.js +2 -2
  314. package/dist/esm/models/send-webhook-test-event200-response.d.ts +2 -2
  315. package/dist/esm/models/send-webhook-test-event200-response.js +2 -2
  316. package/dist/esm/models/statement-document-dto.d.ts +3 -3
  317. package/dist/esm/models/statement-document-dto.js +2 -2
  318. package/dist/esm/models/statement-product-dto.d.ts +2 -2
  319. package/dist/esm/models/statement-product-dto.js +2 -2
  320. package/dist/esm/models/submit-negotiation-scores-request-dto.d.ts +2 -2
  321. package/dist/esm/models/submit-negotiation-scores-request-dto.js +2 -2
  322. package/dist/esm/models/submit-negotiation-scores201-response.d.ts +2 -2
  323. package/dist/esm/models/submit-negotiation-scores201-response.js +2 -2
  324. package/dist/esm/models/supplier-card-payable-response-dto.d.ts +2 -2
  325. package/dist/esm/models/supplier-card-payable-response-dto.js +2 -2
  326. package/dist/esm/models/supplier-tax-type.d.ts +2 -2
  327. package/dist/esm/models/supplier-tax-type.js +2 -2
  328. package/dist/esm/models/token-request-dto.d.ts +5 -5
  329. package/dist/esm/models/token-request-dto.js +2 -2
  330. package/dist/esm/models/token-response-dto.d.ts +3 -3
  331. package/dist/esm/models/token-response-dto.js +2 -2
  332. package/dist/esm/models/update-bid-request-dto.d.ts +5 -5
  333. package/dist/esm/models/update-bid-request-dto.js +2 -2
  334. package/dist/esm/models/update-bid200-response.d.ts +2 -2
  335. package/dist/esm/models/update-bid200-response.js +2 -2
  336. package/dist/esm/models/update-webhook-endpoint-request-dto.d.ts +3 -3
  337. package/dist/esm/models/update-webhook-endpoint-request-dto.js +2 -2
  338. package/dist/esm/models/upload-file-request-dto.d.ts +4 -4
  339. package/dist/esm/models/upload-file-request-dto.js +2 -2
  340. package/dist/esm/models/upload-file201-response.d.ts +2 -2
  341. package/dist/esm/models/upload-file201-response.js +2 -2
  342. package/dist/esm/models/upload-url-created-response-dto.d.ts +5 -5
  343. package/dist/esm/models/upload-url-created-response-dto.js +2 -2
  344. package/dist/esm/models/webhook-bid-event-data.d.ts +3 -3
  345. package/dist/esm/models/webhook-bid-event-data.js +2 -2
  346. package/dist/esm/models/webhook-delivery-dto.d.ts +4 -4
  347. package/dist/esm/models/webhook-delivery-dto.js +2 -2
  348. package/dist/esm/models/webhook-endpoint-dto.d.ts +6 -6
  349. package/dist/esm/models/webhook-endpoint-dto.js +2 -2
  350. package/dist/esm/models/webhook-endpoint-with-secret-dto.d.ts +6 -6
  351. package/dist/esm/models/webhook-endpoint-with-secret-dto.js +2 -2
  352. package/dist/esm/models/webhook-event-envelope.d.ts +3 -3
  353. package/dist/esm/models/webhook-event-envelope.js +2 -2
  354. package/dist/esm/models/webhook-ping-event-data.d.ts +2 -2
  355. package/dist/esm/models/webhook-ping-event-data.js +2 -2
  356. package/dist/esm/models/webhook-test-result-dto.d.ts +3 -3
  357. package/dist/esm/models/webhook-test-result-dto.js +2 -2
  358. package/dist/index.d.ts +2 -2
  359. package/dist/index.js +2 -2
  360. package/dist/models/acceptance-result-response-dto.d.ts +2 -2
  361. package/dist/models/acceptance-result-response-dto.js +2 -2
  362. package/dist/models/acknowledge-product-receipt200-response.d.ts +2 -2
  363. package/dist/models/acknowledge-product-receipt200-response.js +2 -2
  364. package/dist/models/acknowledge-products-request-dto.d.ts +3 -3
  365. package/dist/models/acknowledge-products-request-dto.js +2 -2
  366. package/dist/models/api-catalog-dto.d.ts +2 -2
  367. package/dist/models/api-catalog-dto.js +2 -2
  368. package/dist/models/api-catalog-entry-dto.d.ts +4 -4
  369. package/dist/models/api-catalog-entry-dto.js +2 -2
  370. package/dist/models/api-catalog-link-dto.d.ts +2 -2
  371. package/dist/models/api-catalog-link-dto.js +2 -2
  372. package/dist/models/authorization-server-metadata-dto.d.ts +6 -6
  373. package/dist/models/authorization-server-metadata-dto.js +2 -2
  374. package/dist/models/award-method-public.d.ts +2 -2
  375. package/dist/models/award-method-public.js +2 -2
  376. package/dist/models/award-registered-v2-response-dto.d.ts +3 -3
  377. package/dist/models/award-registered-v2-response-dto.js +2 -2
  378. package/dist/models/award-reverted-v2-response-dto.d.ts +3 -3
  379. package/dist/models/award-reverted-v2-response-dto.js +2 -2
  380. package/dist/models/bid-acceptance-dto.d.ts +2 -2
  381. package/dist/models/bid-acceptance-dto.js +2 -2
  382. package/dist/models/bid-attachment-input-dto.d.ts +6 -6
  383. package/dist/models/bid-attachment-input-dto.js +2 -2
  384. package/dist/models/bid-bond-dto.d.ts +2 -2
  385. package/dist/models/bid-bond-dto.js +2 -2
  386. package/dist/models/bid-cancelled-response-dto.d.ts +3 -3
  387. package/dist/models/bid-cancelled-response-dto.js +2 -2
  388. package/dist/models/bid-contact-dto.d.ts +2 -2
  389. package/dist/models/bid-contact-dto.js +2 -2
  390. package/dist/models/bid-contacts-dto.d.ts +2 -2
  391. package/dist/models/bid-contacts-dto.js +2 -2
  392. package/dist/models/bid-contract-document-dto.d.ts +9 -9
  393. package/dist/models/bid-contract-document-dto.js +2 -2
  394. package/dist/models/bid-delivery-terms-dto.d.ts +2 -2
  395. package/dist/models/bid-delivery-terms-dto.js +2 -2
  396. package/dist/models/bid-detail-response-dto.d.ts +5 -5
  397. package/dist/models/bid-detail-response-dto.js +2 -2
  398. package/dist/models/bid-document-dto.d.ts +2 -2
  399. package/dist/models/bid-document-dto.js +2 -2
  400. package/dist/models/bid-failed-v2-response-dto.d.ts +3 -3
  401. package/dist/models/bid-failed-v2-response-dto.js +2 -2
  402. package/dist/models/bid-item-dto.d.ts +2 -2
  403. package/dist/models/bid-item-dto.js +2 -2
  404. package/dist/models/bid-lifecycle-dto.d.ts +2 -2
  405. package/dist/models/bid-lifecycle-dto.js +2 -2
  406. package/dist/models/bid-manager-dto.d.ts +2 -2
  407. package/dist/models/bid-manager-dto.js +2 -2
  408. package/dist/models/bid-payment-terms-dto.d.ts +2 -2
  409. package/dist/models/bid-payment-terms-dto.js +2 -2
  410. package/dist/models/bid-product-dto.d.ts +2 -2
  411. package/dist/models/bid-product-dto.js +2 -2
  412. package/dist/models/bid-public-status.d.ts +2 -2
  413. package/dist/models/bid-public-status.js +2 -2
  414. package/dist/models/bid-registered-response-dto.d.ts +3 -3
  415. package/dist/models/bid-registered-response-dto.js +2 -2
  416. package/dist/models/bid-result-participant-attachment-dto.d.ts +3 -3
  417. package/dist/models/bid-result-participant-attachment-dto.js +2 -2
  418. package/dist/models/bid-result-participant-dto.d.ts +3 -3
  419. package/dist/models/bid-result-participant-dto.js +2 -2
  420. package/dist/models/bid-results-response-dto.d.ts +5 -5
  421. package/dist/models/bid-results-response-dto.js +2 -2
  422. package/dist/models/bid-settlement-line-item-dto.d.ts +2 -2
  423. package/dist/models/bid-settlement-line-item-dto.js +2 -2
  424. package/dist/models/bid-settlement-participant-dto.d.ts +2 -2
  425. package/dist/models/bid-settlement-participant-dto.js +2 -2
  426. package/dist/models/bid-settlement-response-dto.d.ts +2 -2
  427. package/dist/models/bid-settlement-response-dto.js +2 -2
  428. package/dist/models/bid-statement-response-dto.d.ts +2 -2
  429. package/dist/models/bid-statement-response-dto.js +2 -2
  430. package/dist/models/bid-summary-dto.d.ts +3 -3
  431. package/dist/models/bid-summary-dto.js +2 -2
  432. package/dist/models/bid-type-public.d.ts +2 -2
  433. package/dist/models/bid-type-public.js +2 -2
  434. package/dist/models/bid-updated-response-dto.d.ts +2 -2
  435. package/dist/models/bid-updated-response-dto.js +2 -2
  436. package/dist/models/cancel-bid-request-dto.d.ts +2 -2
  437. package/dist/models/cancel-bid-request-dto.js +2 -2
  438. package/dist/models/cancel-bid200-response.d.ts +2 -2
  439. package/dist/models/cancel-bid200-response.js +2 -2
  440. package/dist/models/card-payment-request-response-dto.d.ts +2 -2
  441. package/dist/models/card-payment-request-response-dto.js +2 -2
  442. package/dist/models/complete-acceptance-request-dto.d.ts +4 -4
  443. package/dist/models/complete-acceptance-request-dto.js +2 -2
  444. package/dist/models/complete-acceptance200-response.d.ts +2 -2
  445. package/dist/models/complete-acceptance200-response.js +2 -2
  446. package/dist/models/complete-invoice200-response.d.ts +2 -2
  447. package/dist/models/complete-invoice200-response.js +2 -2
  448. package/dist/models/complete-upload-request-dto.d.ts +2 -2
  449. package/dist/models/complete-upload-request-dto.js +2 -2
  450. package/dist/models/contract-restriction-confirm-input-dto.d.ts +3 -3
  451. package/dist/models/contract-restriction-confirm-input-dto.js +2 -2
  452. package/dist/models/create-bid-request-dto.d.ts +5 -5
  453. package/dist/models/create-bid-request-dto.js +2 -2
  454. package/dist/models/create-card-payment-dto.d.ts +2 -2
  455. package/dist/models/create-card-payment-dto.js +2 -2
  456. package/dist/models/create-card-payment-request-dto.d.ts +2 -2
  457. package/dist/models/create-card-payment-request-dto.js +2 -2
  458. package/dist/models/create-card-payment200-response.d.ts +2 -2
  459. package/dist/models/create-card-payment200-response.js +2 -2
  460. package/dist/models/create-embed-launch201-response.d.ts +2 -2
  461. package/dist/models/create-embed-launch201-response.js +2 -2
  462. package/dist/models/create-external-contract-documents-request-dto.d.ts +4 -4
  463. package/dist/models/create-external-contract-documents-request-dto.js +2 -2
  464. package/dist/models/create-external-contract-documents-response-dto.d.ts +2 -2
  465. package/dist/models/create-external-contract-documents-response-dto.js +2 -2
  466. package/dist/models/create-file-upload-url201-response.d.ts +2 -2
  467. package/dist/models/create-file-upload-url201-response.js +2 -2
  468. package/dist/models/create-upload-url-request-dto.d.ts +2 -2
  469. package/dist/models/create-upload-url-request-dto.js +2 -2
  470. package/dist/models/create-webhook-endpoint-request-dto.d.ts +4 -4
  471. package/dist/models/create-webhook-endpoint-request-dto.js +2 -2
  472. package/dist/models/create-webhook-endpoint201-response.d.ts +2 -2
  473. package/dist/models/create-webhook-endpoint201-response.js +2 -2
  474. package/dist/models/delivery-date-type-public.d.ts +2 -2
  475. package/dist/models/delivery-date-type-public.js +2 -2
  476. package/dist/models/delivery-method-public.d.ts +2 -2
  477. package/dist/models/delivery-method-public.js +2 -2
  478. package/dist/models/embed-bid-prefill-dto.d.ts +83 -0
  479. package/dist/models/embed-bid-prefill-dto.js +26 -0
  480. package/dist/models/embed-bid-prefill-item-dto.d.ts +33 -0
  481. package/dist/models/embed-bid-prefill-item-dto.js +15 -0
  482. package/dist/models/embed-bid-prefill-manager-dto.d.ts +25 -0
  483. package/dist/models/embed-bid-prefill-manager-dto.js +15 -0
  484. package/dist/models/embed-launch-request-dto.d.ts +10 -9
  485. package/dist/models/embed-launch-request-dto.js +2 -2
  486. package/dist/models/embed-launch-response-dto.d.ts +4 -4
  487. package/dist/models/embed-launch-response-dto.js +2 -2
  488. package/dist/models/excellent-procurement-public.d.ts +2 -2
  489. package/dist/models/excellent-procurement-public.js +2 -2
  490. package/dist/models/external-contract-document-item-dto.d.ts +3 -3
  491. package/dist/models/external-contract-document-item-dto.js +2 -2
  492. package/dist/models/external-contract-documents-response-dto.d.ts +2 -2
  493. package/dist/models/external-contract-documents-response-dto.js +2 -2
  494. package/dist/models/external-contract-item-dto.d.ts +2 -2
  495. package/dist/models/external-contract-item-dto.js +2 -2
  496. package/dist/models/external-contract-snapshot-dto.d.ts +5 -5
  497. package/dist/models/external-contract-snapshot-dto.js +2 -2
  498. package/dist/models/external-document-inputs-dto.d.ts +2 -2
  499. package/dist/models/external-document-inputs-dto.js +2 -2
  500. package/dist/models/file-meta-response-dto.d.ts +2 -2
  501. package/dist/models/file-meta-response-dto.js +2 -2
  502. package/dist/models/file-uploaded-response-dto.d.ts +2 -2
  503. package/dist/models/file-uploaded-response-dto.js +2 -2
  504. package/dist/models/generated-external-contract-document-dto.d.ts +4 -4
  505. package/dist/models/generated-external-contract-document-dto.js +2 -2
  506. package/dist/models/get-bid-settlement200-response.d.ts +2 -2
  507. package/dist/models/get-bid-settlement200-response.js +2 -2
  508. package/dist/models/get-bid-statement200-response.d.ts +2 -2
  509. package/dist/models/get-bid-statement200-response.js +2 -2
  510. package/dist/models/get-bid200-response.d.ts +2 -2
  511. package/dist/models/get-bid200-response.js +2 -2
  512. package/dist/models/get-file-meta200-response.d.ts +2 -2
  513. package/dist/models/get-file-meta200-response.js +2 -2
  514. package/dist/models/get-supplier-card-payable-v2200-response.d.ts +2 -2
  515. package/dist/models/get-supplier-card-payable-v2200-response.js +2 -2
  516. package/dist/models/get-webhook-endpoint200-response.d.ts +2 -2
  517. package/dist/models/get-webhook-endpoint200-response.js +2 -2
  518. package/dist/models/green-product-public.d.ts +2 -2
  519. package/dist/models/green-product-public.js +2 -2
  520. package/dist/models/health-controller-check200-response.d.ts +2 -2
  521. package/dist/models/health-controller-check200-response.js +2 -2
  522. package/dist/models/health-response-dto.d.ts +2 -2
  523. package/dist/models/health-response-dto.js +2 -2
  524. package/dist/models/hierarchical-region-dto.d.ts +2 -2
  525. package/dist/models/hierarchical-region-dto.js +2 -2
  526. package/dist/models/index.d.ts +3 -0
  527. package/dist/models/index.js +3 -0
  528. package/dist/models/introspect-request-dto.d.ts +5 -5
  529. package/dist/models/introspect-request-dto.js +2 -2
  530. package/dist/models/introspection-response-dto.d.ts +4 -4
  531. package/dist/models/introspection-response-dto.js +2 -2
  532. package/dist/models/invalid-param-dto.d.ts +2 -2
  533. package/dist/models/invalid-param-dto.js +2 -2
  534. package/dist/models/invoice-completed-response-dto.d.ts +2 -2
  535. package/dist/models/invoice-completed-response-dto.js +2 -2
  536. package/dist/models/invoice-split-response-dto.d.ts +2 -2
  537. package/dist/models/invoice-split-response-dto.js +2 -2
  538. package/dist/models/legal-mandatory-public.d.ts +2 -2
  539. package/dist/models/legal-mandatory-public.js +2 -2
  540. package/dist/models/list-bid-results200-response.d.ts +2 -2
  541. package/dist/models/list-bid-results200-response.js +2 -2
  542. package/dist/models/list-bids200-response-meta.d.ts +3 -3
  543. package/dist/models/list-bids200-response-meta.js +2 -2
  544. package/dist/models/list-bids200-response.d.ts +2 -2
  545. package/dist/models/list-bids200-response.js +2 -2
  546. package/dist/models/list-products200-response.d.ts +2 -2
  547. package/dist/models/list-products200-response.js +2 -2
  548. package/dist/models/list-webhook-deliveries-response-dto.d.ts +3 -3
  549. package/dist/models/list-webhook-deliveries-response-dto.js +2 -2
  550. package/dist/models/list-webhook-deliveries200-response.d.ts +2 -2
  551. package/dist/models/list-webhook-deliveries200-response.js +2 -2
  552. package/dist/models/list-webhook-endpoints200-response.d.ts +2 -2
  553. package/dist/models/list-webhook-endpoints200-response.js +2 -2
  554. package/dist/models/mark-bid-failed-request-dto.d.ts +2 -2
  555. package/dist/models/mark-bid-failed-request-dto.js +2 -2
  556. package/dist/models/mark-bid-failed201-response.d.ts +2 -2
  557. package/dist/models/mark-bid-failed201-response.js +2 -2
  558. package/dist/models/negotiation-score-dto.d.ts +2 -2
  559. package/dist/models/negotiation-score-dto.js +2 -2
  560. package/dist/models/negotiation-scored-v2-response-dto.d.ts +3 -3
  561. package/dist/models/negotiation-scored-v2-response-dto.js +2 -2
  562. package/dist/models/oauth-error-response-dto.d.ts +2 -2
  563. package/dist/models/oauth-error-response-dto.js +2 -2
  564. package/dist/models/on-bid-award-reverted-request.d.ts +2 -2
  565. package/dist/models/on-bid-award-reverted-request.js +2 -2
  566. package/dist/models/on-bid-awarded-request.d.ts +2 -2
  567. package/dist/models/on-bid-awarded-request.js +2 -2
  568. package/dist/models/on-bid-canceled-request.d.ts +2 -2
  569. package/dist/models/on-bid-canceled-request.js +2 -2
  570. package/dist/models/on-bid-closed-request.d.ts +2 -2
  571. package/dist/models/on-bid-closed-request.js +2 -2
  572. package/dist/models/on-bid-failed-request.d.ts +2 -2
  573. package/dist/models/on-bid-failed-request.js +2 -2
  574. package/dist/models/on-ping-request.d.ts +2 -2
  575. package/dist/models/on-ping-request.js +2 -2
  576. package/dist/models/partner-webhook-delivery-status.d.ts +2 -2
  577. package/dist/models/partner-webhook-delivery-status.js +2 -2
  578. package/dist/models/partner-webhook-endpoint-status.d.ts +3 -3
  579. package/dist/models/partner-webhook-endpoint-status.js +3 -3
  580. package/dist/models/partner-webhook-event-type.d.ts +2 -2
  581. package/dist/models/partner-webhook-event-type.js +2 -2
  582. package/dist/models/payment-method-public.d.ts +2 -2
  583. package/dist/models/payment-method-public.js +2 -2
  584. package/dist/models/preconditions-dto.d.ts +2 -2
  585. package/dist/models/preconditions-dto.js +2 -2
  586. package/dist/models/problem-details-dto.d.ts +3 -3
  587. package/dist/models/problem-details-dto.js +2 -2
  588. package/dist/models/product-receipt-response-dto.d.ts +2 -2
  589. package/dist/models/product-receipt-response-dto.js +2 -2
  590. package/dist/models/product-response-dto.d.ts +3 -3
  591. package/dist/models/product-response-dto.js +2 -2
  592. package/dist/models/protected-resource-metadata-dto.d.ts +6 -6
  593. package/dist/models/protected-resource-metadata-dto.js +2 -2
  594. package/dist/models/register-award-request-dto.d.ts +5 -5
  595. package/dist/models/register-award-request-dto.js +2 -2
  596. package/dist/models/register-award201-response.d.ts +2 -2
  597. package/dist/models/register-award201-response.js +2 -2
  598. package/dist/models/register-bid201-response.d.ts +2 -2
  599. package/dist/models/register-bid201-response.js +2 -2
  600. package/dist/models/register-semo-contract-request-dto.d.ts +5 -5
  601. package/dist/models/register-semo-contract-request-dto.js +2 -2
  602. package/dist/models/request-invoice-split-request-dto.d.ts +4 -4
  603. package/dist/models/request-invoice-split-request-dto.js +2 -2
  604. package/dist/models/request-invoice-split200-response.d.ts +2 -2
  605. package/dist/models/request-invoice-split200-response.js +2 -2
  606. package/dist/models/retiree-roster-input-dto.d.ts +2 -2
  607. package/dist/models/retiree-roster-input-dto.js +2 -2
  608. package/dist/models/retiree-roster-row-dto.d.ts +2 -2
  609. package/dist/models/retiree-roster-row-dto.js +2 -2
  610. package/dist/models/revert-award-request-dto.d.ts +2 -2
  611. package/dist/models/revert-award-request-dto.js +2 -2
  612. package/dist/models/revert-award200-response.d.ts +2 -2
  613. package/dist/models/revert-award200-response.js +2 -2
  614. package/dist/models/revoke-request-dto.d.ts +5 -5
  615. package/dist/models/revoke-request-dto.js +2 -2
  616. package/dist/models/semo-contract-registered-response-dto.d.ts +3 -3
  617. package/dist/models/semo-contract-registered-response-dto.js +2 -2
  618. package/dist/models/semo-contract-taxinvoice-status-response-dto.d.ts +2 -2
  619. package/dist/models/semo-contract-taxinvoice-status-response-dto.js +2 -2
  620. package/dist/models/send-webhook-test-event200-response.d.ts +2 -2
  621. package/dist/models/send-webhook-test-event200-response.js +2 -2
  622. package/dist/models/statement-document-dto.d.ts +3 -3
  623. package/dist/models/statement-document-dto.js +2 -2
  624. package/dist/models/statement-product-dto.d.ts +2 -2
  625. package/dist/models/statement-product-dto.js +2 -2
  626. package/dist/models/submit-negotiation-scores-request-dto.d.ts +2 -2
  627. package/dist/models/submit-negotiation-scores-request-dto.js +2 -2
  628. package/dist/models/submit-negotiation-scores201-response.d.ts +2 -2
  629. package/dist/models/submit-negotiation-scores201-response.js +2 -2
  630. package/dist/models/supplier-card-payable-response-dto.d.ts +2 -2
  631. package/dist/models/supplier-card-payable-response-dto.js +2 -2
  632. package/dist/models/supplier-tax-type.d.ts +2 -2
  633. package/dist/models/supplier-tax-type.js +2 -2
  634. package/dist/models/token-request-dto.d.ts +5 -5
  635. package/dist/models/token-request-dto.js +2 -2
  636. package/dist/models/token-response-dto.d.ts +3 -3
  637. package/dist/models/token-response-dto.js +2 -2
  638. package/dist/models/update-bid-request-dto.d.ts +5 -5
  639. package/dist/models/update-bid-request-dto.js +2 -2
  640. package/dist/models/update-bid200-response.d.ts +2 -2
  641. package/dist/models/update-bid200-response.js +2 -2
  642. package/dist/models/update-webhook-endpoint-request-dto.d.ts +3 -3
  643. package/dist/models/update-webhook-endpoint-request-dto.js +2 -2
  644. package/dist/models/upload-file-request-dto.d.ts +4 -4
  645. package/dist/models/upload-file-request-dto.js +2 -2
  646. package/dist/models/upload-file201-response.d.ts +2 -2
  647. package/dist/models/upload-file201-response.js +2 -2
  648. package/dist/models/upload-url-created-response-dto.d.ts +5 -5
  649. package/dist/models/upload-url-created-response-dto.js +2 -2
  650. package/dist/models/webhook-bid-event-data.d.ts +3 -3
  651. package/dist/models/webhook-bid-event-data.js +2 -2
  652. package/dist/models/webhook-delivery-dto.d.ts +4 -4
  653. package/dist/models/webhook-delivery-dto.js +2 -2
  654. package/dist/models/webhook-endpoint-dto.d.ts +6 -6
  655. package/dist/models/webhook-endpoint-dto.js +2 -2
  656. package/dist/models/webhook-endpoint-with-secret-dto.d.ts +6 -6
  657. package/dist/models/webhook-endpoint-with-secret-dto.js +2 -2
  658. package/dist/models/webhook-event-envelope.d.ts +3 -3
  659. package/dist/models/webhook-event-envelope.js +2 -2
  660. package/dist/models/webhook-ping-event-data.d.ts +2 -2
  661. package/dist/models/webhook-ping-event-data.js +2 -2
  662. package/dist/models/webhook-test-result-dto.d.ts +3 -3
  663. package/dist/models/webhook-test-result-dto.js +2 -2
  664. package/docs/AcknowledgeProductsRequestDto.md +1 -1
  665. package/docs/ApiCatalogEntryDto.md +2 -2
  666. package/docs/AuthorizationServerMetadataDto.md +4 -4
  667. package/docs/AwardRegisteredV2ResponseDto.md +1 -1
  668. package/docs/AwardRevertedV2ResponseDto.md +1 -1
  669. package/docs/BidAttachmentInputDto.md +4 -4
  670. package/docs/BidCancelledResponseDto.md +1 -1
  671. package/docs/BidContractDocumentDto.md +7 -7
  672. package/docs/BidDetailResponseDto.md +3 -3
  673. package/docs/BidFailedV2ResponseDto.md +1 -1
  674. package/docs/BidRegisteredResponseDto.md +1 -1
  675. package/docs/BidResultParticipantAttachmentDto.md +1 -1
  676. package/docs/BidResultParticipantDto.md +1 -1
  677. package/docs/BidResultsResponseDto.md +3 -3
  678. package/docs/BidSummaryDto.md +1 -1
  679. package/docs/CompleteAcceptanceRequestDto.md +2 -2
  680. package/docs/ContractRestrictionConfirmInputDto.md +1 -1
  681. package/docs/CreateBidRequestDto.md +3 -3
  682. package/docs/CreateExternalContractDocumentsRequestDto.md +2 -2
  683. package/docs/CreateWebhookEndpointRequestDto.md +2 -2
  684. package/docs/EmbedApi.md +11 -11
  685. package/docs/EmbedBidPrefillDto.md +46 -0
  686. package/docs/EmbedBidPrefillItemDto.md +28 -0
  687. package/docs/EmbedBidPrefillManagerDto.md +24 -0
  688. package/docs/EmbedLaunchRequestDto.md +6 -6
  689. package/docs/EmbedLaunchResponseDto.md +2 -2
  690. package/docs/ExternalContractDocumentItemDto.md +1 -1
  691. package/docs/ExternalContractSnapshotDto.md +3 -3
  692. package/docs/GeneratedExternalContractDocumentDto.md +2 -2
  693. package/docs/IntrospectRequestDto.md +3 -3
  694. package/docs/IntrospectionResponseDto.md +2 -2
  695. package/docs/ListBids200ResponseMeta.md +1 -1
  696. package/docs/ListWebhookDeliveriesResponseDto.md +1 -1
  697. package/docs/NegotiationScoredV2ResponseDto.md +1 -1
  698. package/docs/OauthApi.md +7 -7
  699. package/docs/PartnerApiApi.md +467 -467
  700. package/docs/PartnerWebhookEndpointStatus.md +1 -1
  701. package/docs/ProblemDetailsDto.md +1 -1
  702. package/docs/ProductResponseDto.md +1 -1
  703. package/docs/ProductsApi.md +28 -28
  704. package/docs/ProtectedResourceMetadataDto.md +4 -4
  705. package/docs/RegisterAwardRequestDto.md +3 -3
  706. package/docs/RegisterSemoContractRequestDto.md +3 -3
  707. package/docs/RequestInvoiceSplitRequestDto.md +2 -2
  708. package/docs/RevokeRequestDto.md +3 -3
  709. package/docs/SemoContractRegisteredResponseDto.md +1 -1
  710. package/docs/StatementDocumentDto.md +1 -1
  711. package/docs/TokenRequestDto.md +3 -3
  712. package/docs/TokenResponseDto.md +1 -1
  713. package/docs/UpdateBidRequestDto.md +3 -3
  714. package/docs/UpdateWebhookEndpointRequestDto.md +1 -1
  715. package/docs/UploadFileRequestDto.md +2 -2
  716. package/docs/UploadUrlCreatedResponseDto.md +3 -3
  717. package/docs/WebhookBidEventData.md +1 -1
  718. package/docs/WebhookDeliveryDto.md +2 -2
  719. package/docs/WebhookEndpointDto.md +4 -4
  720. package/docs/WebhookEndpointWithSecretDto.md +4 -4
  721. package/docs/WebhookEventEnvelope.md +1 -1
  722. package/docs/WebhookTestResultDto.md +1 -1
  723. package/docs/WebhooksApi.md +43 -43
  724. package/docs/WellKnownApi.md +5 -5
  725. package/index.ts +2 -2
  726. package/models/acceptance-result-response-dto.ts +2 -2
  727. package/models/acknowledge-product-receipt200-response.ts +2 -2
  728. package/models/acknowledge-products-request-dto.ts +3 -3
  729. package/models/api-catalog-dto.ts +2 -2
  730. package/models/api-catalog-entry-dto.ts +4 -4
  731. package/models/api-catalog-link-dto.ts +2 -2
  732. package/models/authorization-server-metadata-dto.ts +6 -6
  733. package/models/award-method-public.ts +2 -2
  734. package/models/award-registered-v2-response-dto.ts +3 -3
  735. package/models/award-reverted-v2-response-dto.ts +3 -3
  736. package/models/bid-acceptance-dto.ts +2 -2
  737. package/models/bid-attachment-input-dto.ts +6 -6
  738. package/models/bid-bond-dto.ts +2 -2
  739. package/models/bid-cancelled-response-dto.ts +3 -3
  740. package/models/bid-contact-dto.ts +2 -2
  741. package/models/bid-contacts-dto.ts +2 -2
  742. package/models/bid-contract-document-dto.ts +9 -9
  743. package/models/bid-delivery-terms-dto.ts +2 -2
  744. package/models/bid-detail-response-dto.ts +5 -5
  745. package/models/bid-document-dto.ts +2 -2
  746. package/models/bid-failed-v2-response-dto.ts +3 -3
  747. package/models/bid-item-dto.ts +2 -2
  748. package/models/bid-lifecycle-dto.ts +2 -2
  749. package/models/bid-manager-dto.ts +2 -2
  750. package/models/bid-payment-terms-dto.ts +2 -2
  751. package/models/bid-product-dto.ts +2 -2
  752. package/models/bid-public-status.ts +2 -2
  753. package/models/bid-registered-response-dto.ts +3 -3
  754. package/models/bid-result-participant-attachment-dto.ts +3 -3
  755. package/models/bid-result-participant-dto.ts +3 -3
  756. package/models/bid-results-response-dto.ts +5 -5
  757. package/models/bid-settlement-line-item-dto.ts +2 -2
  758. package/models/bid-settlement-participant-dto.ts +2 -2
  759. package/models/bid-settlement-response-dto.ts +2 -2
  760. package/models/bid-statement-response-dto.ts +2 -2
  761. package/models/bid-summary-dto.ts +3 -3
  762. package/models/bid-type-public.ts +2 -2
  763. package/models/bid-updated-response-dto.ts +2 -2
  764. package/models/cancel-bid-request-dto.ts +2 -2
  765. package/models/cancel-bid200-response.ts +2 -2
  766. package/models/card-payment-request-response-dto.ts +2 -2
  767. package/models/complete-acceptance-request-dto.ts +4 -4
  768. package/models/complete-acceptance200-response.ts +2 -2
  769. package/models/complete-invoice200-response.ts +2 -2
  770. package/models/complete-upload-request-dto.ts +2 -2
  771. package/models/contract-restriction-confirm-input-dto.ts +3 -3
  772. package/models/create-bid-request-dto.ts +5 -5
  773. package/models/create-card-payment-dto.ts +2 -2
  774. package/models/create-card-payment-request-dto.ts +2 -2
  775. package/models/create-card-payment200-response.ts +2 -2
  776. package/models/create-embed-launch201-response.ts +2 -2
  777. package/models/create-external-contract-documents-request-dto.ts +4 -4
  778. package/models/create-external-contract-documents-response-dto.ts +2 -2
  779. package/models/create-file-upload-url201-response.ts +2 -2
  780. package/models/create-upload-url-request-dto.ts +2 -2
  781. package/models/create-webhook-endpoint-request-dto.ts +4 -4
  782. package/models/create-webhook-endpoint201-response.ts +2 -2
  783. package/models/delivery-date-type-public.ts +2 -2
  784. package/models/delivery-method-public.ts +2 -2
  785. package/models/embed-bid-prefill-dto.ts +97 -0
  786. package/models/embed-bid-prefill-item-dto.ts +39 -0
  787. package/models/embed-bid-prefill-manager-dto.ts +31 -0
  788. package/models/embed-launch-request-dto.ts +12 -9
  789. package/models/embed-launch-response-dto.ts +4 -4
  790. package/models/excellent-procurement-public.ts +2 -2
  791. package/models/external-contract-document-item-dto.ts +3 -3
  792. package/models/external-contract-documents-response-dto.ts +2 -2
  793. package/models/external-contract-item-dto.ts +2 -2
  794. package/models/external-contract-snapshot-dto.ts +5 -5
  795. package/models/external-document-inputs-dto.ts +2 -2
  796. package/models/file-meta-response-dto.ts +2 -2
  797. package/models/file-uploaded-response-dto.ts +2 -2
  798. package/models/generated-external-contract-document-dto.ts +4 -4
  799. package/models/get-bid-settlement200-response.ts +2 -2
  800. package/models/get-bid-statement200-response.ts +2 -2
  801. package/models/get-bid200-response.ts +2 -2
  802. package/models/get-file-meta200-response.ts +2 -2
  803. package/models/get-supplier-card-payable-v2200-response.ts +2 -2
  804. package/models/get-webhook-endpoint200-response.ts +2 -2
  805. package/models/green-product-public.ts +2 -2
  806. package/models/health-controller-check200-response.ts +2 -2
  807. package/models/health-response-dto.ts +2 -2
  808. package/models/hierarchical-region-dto.ts +2 -2
  809. package/models/index.ts +3 -0
  810. package/models/introspect-request-dto.ts +5 -5
  811. package/models/introspection-response-dto.ts +4 -4
  812. package/models/invalid-param-dto.ts +2 -2
  813. package/models/invoice-completed-response-dto.ts +2 -2
  814. package/models/invoice-split-response-dto.ts +2 -2
  815. package/models/legal-mandatory-public.ts +2 -2
  816. package/models/list-bid-results200-response.ts +2 -2
  817. package/models/list-bids200-response-meta.ts +3 -3
  818. package/models/list-bids200-response.ts +2 -2
  819. package/models/list-products200-response.ts +2 -2
  820. package/models/list-webhook-deliveries-response-dto.ts +3 -3
  821. package/models/list-webhook-deliveries200-response.ts +2 -2
  822. package/models/list-webhook-endpoints200-response.ts +2 -2
  823. package/models/mark-bid-failed-request-dto.ts +2 -2
  824. package/models/mark-bid-failed201-response.ts +2 -2
  825. package/models/negotiation-score-dto.ts +2 -2
  826. package/models/negotiation-scored-v2-response-dto.ts +3 -3
  827. package/models/oauth-error-response-dto.ts +2 -2
  828. package/models/on-bid-award-reverted-request.ts +2 -2
  829. package/models/on-bid-awarded-request.ts +2 -2
  830. package/models/on-bid-canceled-request.ts +2 -2
  831. package/models/on-bid-closed-request.ts +2 -2
  832. package/models/on-bid-failed-request.ts +2 -2
  833. package/models/on-ping-request.ts +2 -2
  834. package/models/partner-webhook-delivery-status.ts +2 -2
  835. package/models/partner-webhook-endpoint-status.ts +3 -3
  836. package/models/partner-webhook-event-type.ts +2 -2
  837. package/models/payment-method-public.ts +2 -2
  838. package/models/preconditions-dto.ts +2 -2
  839. package/models/problem-details-dto.ts +3 -3
  840. package/models/product-receipt-response-dto.ts +2 -2
  841. package/models/product-response-dto.ts +3 -3
  842. package/models/protected-resource-metadata-dto.ts +6 -6
  843. package/models/register-award-request-dto.ts +5 -5
  844. package/models/register-award201-response.ts +2 -2
  845. package/models/register-bid201-response.ts +2 -2
  846. package/models/register-semo-contract-request-dto.ts +5 -5
  847. package/models/request-invoice-split-request-dto.ts +4 -4
  848. package/models/request-invoice-split200-response.ts +2 -2
  849. package/models/retiree-roster-input-dto.ts +2 -2
  850. package/models/retiree-roster-row-dto.ts +2 -2
  851. package/models/revert-award-request-dto.ts +2 -2
  852. package/models/revert-award200-response.ts +2 -2
  853. package/models/revoke-request-dto.ts +5 -5
  854. package/models/semo-contract-registered-response-dto.ts +3 -3
  855. package/models/semo-contract-taxinvoice-status-response-dto.ts +2 -2
  856. package/models/send-webhook-test-event200-response.ts +2 -2
  857. package/models/statement-document-dto.ts +3 -3
  858. package/models/statement-product-dto.ts +2 -2
  859. package/models/submit-negotiation-scores-request-dto.ts +2 -2
  860. package/models/submit-negotiation-scores201-response.ts +2 -2
  861. package/models/supplier-card-payable-response-dto.ts +2 -2
  862. package/models/supplier-tax-type.ts +2 -2
  863. package/models/token-request-dto.ts +5 -5
  864. package/models/token-response-dto.ts +3 -3
  865. package/models/update-bid-request-dto.ts +5 -5
  866. package/models/update-bid200-response.ts +2 -2
  867. package/models/update-webhook-endpoint-request-dto.ts +3 -3
  868. package/models/upload-file-request-dto.ts +4 -4
  869. package/models/upload-file201-response.ts +2 -2
  870. package/models/upload-url-created-response-dto.ts +5 -5
  871. package/models/webhook-bid-event-data.ts +3 -3
  872. package/models/webhook-delivery-dto.ts +4 -4
  873. package/models/webhook-endpoint-dto.ts +6 -6
  874. package/models/webhook-endpoint-with-secret-dto.ts +6 -6
  875. package/models/webhook-event-envelope.ts +3 -3
  876. package/models/webhook-ping-event-data.ts +2 -2
  877. package/models/webhook-test-result-dto.ts +3 -3
  878. package/package.json +1 -1
@@ -3,9 +3,9 @@
3
3
  /* eslint-disable */
4
4
  /**
5
5
  * CMARKET V6 Partner API
6
- * 외부 ERP 연동용 RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` 플로우). `/oauth/token` 에서 토큰을 발급받아 `Authorization: Bearer <token>` 헤더로 실으세요. ## 권한 — 두 개의 독립된 축 `403` 만났다면 둘 중 어느 축에 걸린 것인지 먼저 구분하세요. - **스코프** = *무엇을 할 수 있나*. 토큰에 부여된 `bids:read`·`contracts:write` 등입니다. 미보유 시 `…/insufficient-scope`. - **대행 범위** = *누구의 데이터를 다룰 수 있나*. API 키 설정이며 스코프로 표현되지 않습니다. 범위 밖이면 스코프와 무관하게 403 입니다. 대행 범위는 키마다 둘 중 하나로 설정됩니다 — **소속 그룹 전원**(기관 키. 사업처·부서 계정이 새로 생겨도 자동 포함) 또는 **지정 발주처 목록**(계약으로 합의된 목록). 범위를 넓혀야 하면 스코프가 아니라 키 설정 변경을 요청하세요. ## 성공 응답 봉투 `/v2` 모든 2xx 본문은 `{ \"data\": … }` 입니다. 단일 리소스든 목록이든 같습니다. **목록은 `data` 배열이고 `meta` 항상 함께 실립니다** — `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 리소스 응답에는 `meta` 나가지 않습니다. 봉투를 쓰지 않는 표면은 둘입니다. `/oauth/_*` `/.well-known/_*` 각각 RFC 6749·RFC 8414·RFC 9728 이 최상위 필드를 규정하고, 파일 내용 응답은 본문이 JSON 이 아닙니다. 에러 응답에는 봉투를 씌우지 않습니다 — 아래 problem+json 이 단독으로 책임집니다. ## 조건부 요청 (ETag) `/v2` 모든 `GET` 응답에 weak `ETag`(`W/\"…\"`)가 실립니다. 받은 값을 다음 요청의 `If-None-Match` 헤더로 되보내면, 내용이 그대로일 때 `304 Not Modified` 본문 없이 받습니다. 결과가 나기를 기다리며 같은 자원을 반복 조회하는 연동이라면 이 헤더 하나로 전송량이 사라집니다. ## 에러 (RFC 9457 problem+json) 모든 에러 응답은 `application/problem+json` 입니다. **HTTP status + `type` URI** 로 분기하세요. - `retryable`(boolean): 자동 재시도 안전 여부. `true`(429·5xx transient)면 backoff 후 재시도하고, `false`면 요청을 고쳐야 합니다. - `traceId`: 요청 추적 id. `X-Correlation-Id` 응답 헤더와 같은 값입니다 — 문의할 때 이 값을 첨부하세요. - `correlationId`: `traceId` 같은 값의 옛 이름. 기존 연동 호환으로 함께 실립니다. 새 연동은 `traceId` 읽으세요. - `invalid-params`: 검증 실패(400 `…/validation-failed`) 시 위반 필드 경로 목록(RFC 9457 확장, 값 없음). `type` `https://problems.cmarket.io/partner/<slug>` 형태의 **안정 식별자**입니다. RFC 9457 §3.1.1 이 허용하는 대로 이 URI 는 **역참조(dereference)되지 않습니다** — 브라우저로 열지 말고 문자열 비교로만 쓰세요. slug 목록과 의미는 각 엔드포인트의 응답 설명에 status 별로 적혀 있습니다. ### 멱등성 위반: 409 와 422 의 차이 - `409` `…/idempotency-key-conflict` — 같은 키의 **원 요청이 아직 처리 중**입니다. 잠시 뒤 같은 키로 다시 부르면 그 결과를 받습니다. - `422` `…/idempotency-key-reused` — 같은 키를 **다른 body** 로 보냈습니다. 재시도해도 영원히 같은 실패이니 새 키를 쓰거나 body 를 되돌리세요. ## Rate Limit 전역 **60 요청/분 per `client_id`**, 토큰 발급(`/oauth/token`)은 **5 요청/분** 입니다. 초과 시 `429`(`type: …/too-many-requests`). 쿼터는 두 가지 표기로 함께 나갑니다 — 신규 연동은 표준 필드를 쓰세요. - **표준**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (정책) · `RateLimit: \"default\";r=59;t=42` (잔량 r, 리셋까지 t 초) - **레거시**(관용): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. 기존 연동 호환을 위해 유지합니다. `429` 에서는 `Retry-After`(초)가 우선합니다. 대량 동기화(품목 단위 반복 등록 등)는 `Retry-After` 만큼 backoff 후 재시도하세요. ## 추적 요청에 `X-Correlation-Id` 헤더를 실으면 그대로 echo 되고, 없으면 서버가 발급합니다. 모든 응답(성공/에러)에 `X-Correlation-Id` 실립니다. ## 전방호환 — 모르는 필드와 값에서 깨지지 않게 다음 셋은 breaking 변경으로 보지 않으며 minor 릴리스에서 예고 없이 일어납니다. 이 전제로 구현하세요. - **선택 필드 추가**: 모르는 필드는 무시하세요. 엄격 파서(unknown key 거부)를 쓰지 마세요. - **enum 값 추가**: 상태·낙찰방법 등에 새 값이 생깁니다. 모르는 값을 만나면 예외를 던지지 말고 원문 문자열을 보존하세요. - **problem `type` slug 추가**: 모르는 slug 은 **HTTP status 로 폴백**해 분기하세요. ## 버전 수명(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` 헤더로 통지합니다. 이 헤더를 모니터링하세요.
6
+ * 외부 ERP 연동용 RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` 플로우). `/oauth/token`에서 토큰을 발급받아 `Authorization: Bearer <token>` 헤더로 실으세요. ## 권한 — 두 개의 독립된 축 `403`을 만났다면 둘 중 어느 축에 걸린 것인지 먼저 구분하세요. - **스코프** = *무엇을 할 수 있나*. 토큰에 부여된 `bids:read`·`contracts:write` 등입니다. 미보유 시 `…/insufficient-scope`. - **대행 범위** = *누구의 데이터를 다룰 수 있나*. API 키 설정이며 스코프로 표현되지 않습니다. 범위 밖이면 스코프와 무관하게 403입니다. 대행 범위는 키마다 둘 중 하나로 설정됩니다 — **소속 그룹 전원**(기관 키. 사업처·부서 계정이 새로 생겨도 자동 포함) 또는 **지정 발주기관 목록**(계약으로 합의된 목록). 범위를 넓혀야 하면 스코프가 아니라 키 설정 변경을 요청하세요. ## 성공 응답 봉투 `/v2`의 모든 2xx 본문은 `{ \"data\": … }`입니다. 단일 리소스든 목록이든 같습니다. **목록은 `data`가 배열이고 `meta`가 항상 함께 실립니다** — `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 리소스 응답에는 `meta`가 나가지 않습니다. 봉투를 쓰지 않는 표면은 둘입니다. `/oauth/_*`와 `/.well-known/_*`는 각각 RFC 6749·RFC 8414·RFC 9728이 최상위 필드를 규정하고, 파일 내용 응답은 본문이 JSON이 아닙니다. 에러 응답에는 봉투를 씌우지 않습니다 — 아래 problem+json이 단독으로 책임집니다. ## 조건부 요청 (ETag) `/v2`의 모든 `GET` 응답에 weak `ETag`(`W/\"…\"`)가 실립니다. 받은 값을 다음 요청의 `If-None-Match` 헤더로 되보내면, 내용이 그대로일 때 `304 Not Modified`를 본문 없이 받습니다. 결과가 나기를 기다리며 같은 자원을 반복 조회하는 연동이라면 이 헤더 하나로 전송량이 사라집니다. ## 에러 (RFC 9457 problem+json) 모든 에러 응답은 `application/problem+json`입니다. **HTTP status + `type` URI** 로 분기하세요. - `retryable`(boolean): 자동 재시도 안전 여부. `true`(429·5xx transient)면 backoff 후 재시도하고, `false`면 요청을 고쳐야 합니다. - `traceId`: 요청 추적 id. `X-Correlation-Id` 응답 헤더와 같은 값입니다 — 문의할 때 이 값을 첨부하세요. - `correlationId`: `traceId`와 같은 값의 옛 이름. 기존 연동 호환으로 함께 실립니다. 새 연동은 `traceId`를 읽으세요. - `invalid-params`: 검증 실패(400 `…/validation-failed`) 시 위반 필드 경로 목록(RFC 9457 확장, 값 없음). `type`은 `https://problems.cmarket.io/partner/<slug>` 형태의 **안정 식별자**입니다. RFC 9457 §3.1.1이 허용하는 대로 이 URI는 **역참조(dereference)되지 않습니다** — 브라우저로 열지 말고 문자열 비교로만 쓰세요. slug 목록과 의미는 각 엔드포인트의 응답 설명에 status 별로 적혀 있습니다. ### 멱등성 위반: 409와 422의 차이 - `409` `…/idempotency-key-conflict` — 같은 키의 **원 요청이 아직 처리 중**입니다. 잠시 뒤 같은 키로 다시 부르면 그 결과를 받습니다. - `422` `…/idempotency-key-reused` — 같은 키를 **다른 body** 로 보냈습니다. 재시도해도 영원히 같은 실패이니 새 키를 쓰거나 body를 되돌리세요. ## Rate Limit 전역 **60 요청/분 per `client_id`**, 토큰 발급(`/oauth/token`)은 **5 요청/분** 입니다. 초과 시 `429`(`type: …/too-many-requests`). 쿼터는 두 가지 표기로 함께 나갑니다 — 신규 연동은 표준 필드를 쓰세요. - **표준**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (정책) · `RateLimit: \"default\";r=59;t=42` (잔량 r, 리셋까지 t 초) - **레거시**(관용): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. 기존 연동 호환을 위해 유지합니다. `429` 에서는 `Retry-After`(초)가 우선합니다. 대량 동기화(품목 단위 반복 등록 등)는 `Retry-After` 만큼 backoff 후 재시도하세요. ## 추적 요청에 `X-Correlation-Id` 헤더를 실으면 그대로 echo 되고, 없으면 서버가 발급합니다. 모든 응답(성공/에러)에 `X-Correlation-Id`가 실립니다. ## 전방호환 — 모르는 필드와 값에서 깨지지 않게 다음 셋은 breaking 변경으로 보지 않으며 minor 릴리스에서 예고 없이 일어납니다. 이 전제로 구현하세요. - **선택 필드 추가**: 모르는 필드는 무시하세요. 엄격 파서(unknown key 거부)를 쓰지 마세요. - **enum 값 추가**: 상태·낙찰방법 등에 새 값이 생깁니다. 모르는 값을 만나면 예외를 던지지 말고 원문 문자열을 보존하세요. - **problem `type` slug 추가**: 모르는 slug은 **HTTP status로 폴백**해 분기하세요. ## 버전 수명(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` 헤더로 통지합니다. 이 헤더를 모니터링하세요.
7
7
  *
8
- * The version of the OpenAPI document: 39.0.0
8
+ * The version of the OpenAPI document: 40.0.0
9
9
  * Contact: semo.io.kr@gmail.com
10
10
  *
11
11
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -35,10 +35,10 @@ const base_1 = require("../base");
35
35
  const PartnerApiApiAxiosParamCreator = function (configuration) {
36
36
  return {
37
37
  /**
38
- * 진행중인 공고를 취소합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **되돌릴없습니다.** 취소 사유는 필수이며 공고 이력에 남습니다. **전제조건:** 진행중(ONGOING) 상태여야 합니다. **거부:** 진행중이 아니거나 이미 취소된 공고 409. 발주처 공고 403. **마감과의 차이:** 취소는 공고를 무효로 되돌리는 것이고, 유찰(`POST /v2/bids/{bidRef}/fail`)은 응찰을 받았으나 낙찰자를 정하지 못한 종료입니다.
38
+ * 진행중(`ONGOING`) 공고를 취소합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 되돌릴 없습니다. 취소 사유는 필수이고 공고 이력에 남습니다. - 진행중이 아니거나 이미 취소된 공고는 409, 다른 발주기관의 공고는 403입니다. - 응찰은 받았으나 낙찰자를 정하지 못한 종료는 취소가 아니라 유찰(`POST /v2/bids/{bidRef}/fail`)입니다.
39
39
  * @summary 공고 취소
40
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
41
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
40
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
41
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
42
42
  * @param {CancelBidRequestDto} cancelBidRequestDto
43
43
  * @param {*} [options] Override http request option.
44
44
  * @throws {RequiredError}
@@ -79,10 +79,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
79
79
  };
80
80
  }),
81
81
  /**
82
- * 낙찰 공고의 검수(납품 검수)가 완료되었음을 기록합니다. **호출 시점:** 낙찰자(공급사)가 납품을 완료하고 구매자가 검수를 확인한 시점입니다. 공고 상태가 낙찰(AWARDED) 상태여야 합니다. **부수효과:** - 검수완료 상태가 기록됩니다. - 현금 결제 공고는 세금계산서 발행요청이 등록되고, 낙찰자(공급사)에게 발행요청 알림·문자가 발송됩니다. 카드 결제 공고는 발행요청 축이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 응답 코드는 200이며, 처리 결과가 본문에 담겨 반환됩니다. **부분계약(협의 감액):** 낙찰 후 협의로 계약금액이 줄었으면 `supplyAmount`+`vat` 함께 보내세요. 그 금액으로 계산서 발행이 요청됩니다. 생략하면 낙찰금액에서 파생합니다. 현금 결제 공고·낙찰자 1인·감액(증액 불가)일 때만 허용되며, 어긋나면 409 입니다. **문서에 찍히는 값:** 거래명세서·검수보고서의 구매사 사업자정보·담당자·작성일자는 등록된 발주처 정보에서 채워집니다. 요청으로 덮어쓸 수 없습니다. **낙찰자:** 공고의 낙찰 상태에서 결정되며 요청으로 지정하지 않습니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
82
+ * 납품 검수 완료를 기록합니다. 낙찰 처리된 공고에서 호출합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 현금 결제 공고는 세금계산서 발행요청이 등록되고 낙찰자에게 알림·문자가 나갑니다. 카드 결제 공고는 발행요청이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 협의로 계약금액이 줄었으면 `supplyAmount`와 `vat`를 함께 보냅니다. 현금 결제·낙찰자 1인·감액일 때만 허용하며 어긋나면 409입니다. 생략하면 낙찰금액에서 파생합니다. - 문서에 찍히는 구매사 사업자정보·담당자·작성일자와 낙찰자는 등록된 값에서 채워지며 요청으로 바꿀 수 없습니다.
83
83
  * @summary 검수완료 전송
84
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
85
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
84
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
85
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
86
86
  * @param {CompleteAcceptanceRequestDto} completeAcceptanceRequestDto
87
87
  * @param {*} [options] Override http request option.
88
88
  * @throws {RequiredError}
@@ -123,10 +123,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
123
123
  };
124
124
  }),
125
125
  /**
126
- * `uploadUrl` 로의 `PUT` 이 끝난 뒤 호출합니다. 올라온 파일을 실측해 등록하고, 시점부터 `fileKey` 공고 첨부로 쓸 수 있습니다. **확정 `fileKey` 첨부로 없습니다** 공고 등록이 400 으로 거절됩니다. **신고한 크기가 아니라 실제 파일을 봅니다.** 발급 요청의 `fileSize` 와 다르면 실제 크기가 기록되고, 정책 상한을 넘으면 여기서 거절됩니다. **같은 `fileKey` 여러 번 호출해도 안전합니다**(멱등). **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
126
+ * `uploadUrl`로 올린 파일을 확정합니다. 시점부터 `fileKey`를 공고 첨부로 쓸 수 있습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. - 확정 `fileKey`를 첨부로 쓰면 공고 등록이 400입니다. - 신고한 `fileSize`가 아니라 실제 파일을 측정해 기록하며, 정책 상한을 넘으면 여기서 거절됩니다. - 같은 `fileKey`로 여러 번 호출해도 안전합니다.
127
127
  * @summary 대용량 업로드 2/2 — 업로드 확정
128
128
  * @param {string} fileKey 발급 응답의 fileKey(영문 대소문자·숫자 32자).
129
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
129
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
130
130
  * @param {CompleteUploadRequestDto} completeUploadRequestDto
131
131
  * @param {*} [options] Override http request option.
132
132
  * @throws {RequiredError}
@@ -167,10 +167,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
167
167
  };
168
168
  }),
169
169
  /**
170
- * 공급사로부터 계산서를 수령한 뒤, 계약을 완료처리 상태로 강제 전환합니다. **호출 시점:** 낙찰·계약 완료 후 공급사 계산서를 오프라인으로 수령했을 때. **부수효과:** - 결제완료·계산서 발급 상태가 기록되고 발급일자가 현재 시각으로 설정됩니다. **소유권:** 공고는 요청 파트너 키가 소유한 발주처 명의여야 합니다(타 발주처 공고 → 403). **이미 완료:** 이미 완료처리된 공고 재호출 → 409. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
170
+ * 공급사에게 계산서를 수령한 계약을 완료처리합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 결제완료·계산서 발급 상태가 기록되고 발급일자는 현재 시각이 됩니다. - 이미 완료된 공고는 409, 다른 발주기관의 공고는 403입니다.
171
171
  * @summary 정산 마감
172
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
173
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
172
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
173
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
174
174
  * @param {*} [options] Override http request option.
175
175
  * @throws {RequiredError}
176
176
  */
@@ -206,9 +206,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
206
206
  };
207
207
  }),
208
208
  /**
209
- * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable` 미리 확인하세요. 미가입 업체로 발행하면 400 입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
209
+ * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable`로 미리 확인하세요. 미가입 업체로 발행하면 400입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
210
210
  * @summary 결제창 발행
211
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
211
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
212
212
  * @param {CreateCardPaymentDto} createCardPaymentDto
213
213
  * @param {*} [options] Override http request option.
214
214
  * @throws {RequiredError}
@@ -246,9 +246,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
246
246
  };
247
247
  }),
248
248
  /**
249
- * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
249
+ * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
250
250
  * @summary 계약서류 생성
251
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
251
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
252
252
  * @param {CreateExternalContractDocumentsRequestDto} createExternalContractDocumentsRequestDto
253
253
  * @param {*} [options] Override http request option.
254
254
  * @throws {RequiredError}
@@ -286,9 +286,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
286
286
  };
287
287
  }),
288
288
  /**
289
- * 파일 본문을 스토리지로 **직접** 올리기 위한 1회용 서명 URL 발급합니다. 3단계로 씁니다. 1. 이 호출로 `fileKey` `uploadUrl` 받습니다. 2. `uploadUrl` 파일 본문을 `PUT` 합니다 응답의 `contentType` `Content-Type` 헤더에 그대로 실으세요. 요청은 c-market 거치지 않습니다. 3. `POST /v2/files/{fileKey}/complete` 확정합니다. **2단계는 이 명세에 오퍼레이션으로 나오지 않습니다** — 요청이 c-market 이 아니라 스토리지로 가기 때문입니다. 형태는 이게 전부입니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` ```ts import { readFile } from \'node:fs/promises\'; // 본문은 **파일 바이트 그대로**입니다 — JSON 도 multipart 도 아닙니다. await fetch(uploadUrl, { method: \'PUT\', headers: { \'Content-Type\': contentType }, body: await readFile(\'시방서.pdf\'), }); ``` **`Authorization` 헤더를 붙이지 마세요.** 자격증명이 `uploadUrl` 안에 서명으로 들어 있어 별도 인증이 필요 없습니다. 같은 이유로 주소는 **주소 자체가 자격증명**이므로 로그에 남기지 마세요. **2단계의 실패 응답은 problem+json 아닙니다.** 스토리지가 직접 답하므로 본문 형식이 다릅니다 — c-market 에러 파서에 넣지 마세요. 만료(`400`)·중복 업로드(`409`)라면 1단계부터 다시 하세요. **`POST /v2/files` 와 언제 갈리나:** 기본은 `POST /v2/files` 한 번입니다 — `base64` 로 23MB, `url` 로 30MB 까지 그 한 번으로 끝납니다. 그 위(**100MB** 까지)만 이 2단계 경로를 쓰세요. 바이트가 c-market 을 지나지 않아 서버 경유 천장을 받지 않습니다. **`uploadUrl` 1회용입니다.** 덮어쓰기가 막혀 있고 `expiresIn` 만료됩니다 저장해 두고 재사용하지 마시고, 만료됐다면 호출부터 다시 하세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
289
+ * 파일을 스토리지로 직접 올리기 위한 1회용 서명 URL을 발급합니다(100MB까지). 스코프 `files:write` · `Idempotency-Key` 헤더 필수. 1. 이 호출로 `fileKey`와 `uploadUrl`을 받습니다. 2. `uploadUrl`에 파일 바이트를 그대로 `PUT` 합니다. 응답의 `contentType`을 `Content-Type` 헤더에 싣고, `Authorization` 헤더는 붙이지 않습니다(주소 자체가 자격증명입니다). 3. `POST /v2/files/{fileKey}/complete`로 확정합니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` - 2단계는 요청이 스토리지로 가므로명세에 오퍼레이션이 없고, 실패 본문도 problem+json이 아닙니다. 만료(400)·중복 업로드(409) 1단계부터 다시 합니다. - `uploadUrl`은 1회용이며 `expiresIn`초만료됩니다. 주소가 자격증명이므로 로그에 남기지 않습니다. - 30MB 이하는 `POST /v2/files` 번으로 끝납니다.
290
290
  * @summary 대용량 업로드 1/2 — 업로드 주소 발급
291
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
291
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
292
292
  * @param {CreateUploadUrlRequestDto} createUploadUrlRequestDto
293
293
  * @param {*} [options] Override http request option.
294
294
  * @throws {RequiredError}
@@ -326,9 +326,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
326
326
  };
327
327
  }),
328
328
  /**
329
- * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 1회. 수신 주소가 바뀌면 새로 만들지 말고 `PATCH` 고치세요 — 그래야 시크릿과 전송 이력이 유지됩니다. **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 응답의 `secret` 을 즉시 안전한 곳에 보관하세요. 잃어버렸다면 복구가 아니라 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret` 으로 **재발급**해야 합니다. **거절되는 경우와 고치는 법:** - `400` `url` HTTPS 아니거나 형식이 잘못됨, `eventTypes` 비었거나 목록 값 (`ping` 은 구독 불가). 값을 고쳐 재시도하세요. - `400` `Idempotency-Key` 헤더 누락/형식 오류. UUID v4 를 실어 보내세요. - `403` 토큰에 `webhooks:write` 스코프가 없음. 키 발급 설정을 넓혀야 합니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 — 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 계산해 **base64** 인코딩하고, `webhook-signature` `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 공백으로 구분된 **여러 서명**을 실을 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 같은 값)도 실립니다 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
329
+ * 수신 주소와 구독할 이벤트를 등록합니다. 연동 초기 1 호출합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 잃어버렸다면 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret`으로 재발급합니다. - 수신 주소가 바뀌면 새로 만들지 말고 `PATCH`로 고치세요. 시크릿과 전송 이력이 유지됩니다. - `url`은 HTTPS만 허용하고 `eventTypes`는 아래 목록 안의 값이어야 합니다. 어기면 400입니다. ### 서명 검증 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약입니다. 직접 짜지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿(`whsec_…`)을 그대로 넘기세요. ```ts import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); // 실패하면 예외 ``` 라이브러리를 쓸 수 없다면 헤더 셋으로 직접 검증합니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 base64 디코드한 바이트가 HMAC 키입니다. 2. `{webhook-id}.{webhook-timestamp}.{본문}`을 연결합니다. 본문은 **파싱 전 원문 바이트**여야 합니다. JSON을 다시 직렬화하면 순서·공백이 달라져 서명이 어긋납니다. 3. HMAC-SHA256을 base64로 인코딩해 `webhook-signature`의 `v1,` 뒤 값과 상수 시간 함수로 비교합니다. 4. `webhook-timestamp`가 5 이상 지났으면 거절합니다. `webhook-signature`에는 서명이 여러 실릴있으므로(키 회전용) 하나라도 맞으면 통과로 처리하세요. ### 중복 제거 `webhook-id`가 이벤트 식별자입니다. 재시도에도 같은 값이 오므로 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상이며 중복 제거는 수신측 책임입니다. `webhook-event-type` 헤더에 본문 `type`과 같은 값이 실려, 본문을 파싱하기 전에 거를 수 있습니다. ### 재시도와 자동 중지 2xx를 돌려주면 성공입니다. 그 외에는 최대 7회 재시도하며 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간입니다. 처리가 길면 먼저 2xx를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 `DISABLED`로 내려갑니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}`에 `{\"status\":\"ACTIVE\"}`로 되살리세요. ### 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping`은 연결 확인 전용이라 구독할 수 없습니다. 놓친 이벤트는 `GET /v2/webhook-deliveries`로 조회해 메웁니다.
330
330
  * @summary 웹훅 구독 등록
331
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
331
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
332
332
  * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
333
333
  * @param {*} [options] Override http request option.
334
334
  * @throws {RequiredError}
@@ -366,11 +366,11 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
366
366
  };
367
367
  }),
368
368
  /**
369
- * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH {\"status\":\"DISABLED\"}` 쓰세요 시크릿과 이벤트 구성이 남아 그대로 되살릴 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
369
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 되돌릴없습니다. 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. 잠시만 멈추려면 `PATCH`로 `{\"status\":\"DISABLED\"}`를 보내세요. - `If-Match`가 필수입니다. 누락은 428, 그 사이 구독이 바뀌었으면 412입니다.
370
370
  * @summary 웹훅 구독 삭제
371
371
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
372
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
373
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
372
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
373
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
374
374
  * @param {*} [options] Override http request option.
375
375
  * @throws {RequiredError}
376
376
  */
@@ -411,9 +411,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
411
411
  };
412
412
  }),
413
413
  /**
414
- * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`URL 을 가리킨다. 요청 시점에 서명하므로 URL 을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}` 파일 메타와 `downloadUrl` v2 응답 규약으로 돌려줍니다. 이 안정 URL 은 파트너 응답의 `fileUrl`/`fullUrl` 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
414
+ * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`이 이 URL을 가리킨다. 요청 시점에 서명하므로 URL을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}`가 파일 메타와 `downloadUrl`을 v2 응답 규약으로 돌려줍니다. 이 안정 URL은 파트너 응답의 `fileUrl`/`fullUrl`이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
415
415
  * @summary 파일 다운로드
416
- * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다.
416
+ * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다.
417
417
  * @param {*} [options] Override http request option.
418
418
  * @throws {RequiredError}
419
419
  */
@@ -440,10 +440,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
440
440
  };
441
441
  }),
442
442
  /**
443
- * 공고의 모든 정보를 번에 조회합니다 — 기본 정보·납품/대금 조건·담당자·품목, 응찰 참여자(투찰가·순위·낙찰 여부), 계약서류, 검수 진행 상태, 라이프사이클 하위 상태. 스코프 `bids:read`. ERP 는 이 엔드포인트를 폴링해 async 처리(정산 마감 등)의 성사를 관측합니다. **낙찰 여부:** 응답의 `status` 아니라 `participants[].isWinner` 관측합니다. AWARDED 라는 공고 상태는 존재하지 않으며(낙찰 직후 공고는 CONTRACT_IN_PROGRESS 로 전이) `status === \'AWARDED\'` 기다리면 영원히 도달하지 않습니다. **여러 건을 한 번에:** 공고마다 이 조회를 반복하지 말고 `GET /v2/bid-results` 배치 조회를 쓰세요. **계약서류는 이 응답에 실립니다.** `contractDocuments[]` 서류별 `paperCode`·`paperName`· `fileKey`·`downloadUrl`·`uploadedAt`·`winnerSequence` 를 담습니다 — 계약서류만 따로 받는 엔드포인트는 두지 않습니다. `generationState` **관측 전용**이며 `DEAD_LETTER` 보이면 자동 재시도가 소진된 상태라 API 되살릴 수 없습니다(운영에 문의하세요). **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
443
+ * 공고 건의 전체 정보를 조회합니다 — 기본 정보, 납품·대금 조건, 담당자, 품목, 응찰 참여자, 계약서류, 검수 상태. 스코프 `bids:read`. - 낙찰 여부는 `status`가 아니라 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없어(낙찰 직후 `CONTRACT_IN_PROGRESS`) `status === \'AWARDED\'` 폴링은 끝나지 않습니다. - 계약서류는 `contractDocuments[]`에 실립니다. 따로 받는 엔드포인트는 없습니다. - 여러 건은 `GET /v2/bid-results`로 번에 받습니다. - 다른 발주기관의 공고는 403입니다.
444
444
  * @summary 공고 상세 조회
445
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
446
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
445
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
446
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
447
447
  * @param {*} [options] Override http request option.
448
448
  * @throws {RequiredError}
449
449
  */
@@ -477,10 +477,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
477
477
  };
478
478
  }),
479
479
  /**
480
- * 낙찰 공급사의 사업자·계좌·공급가액/부가세·응찰 품목내역을 조회합니다. 대금 지급에 필요한 정보입니다. 다른 조회에서 일부 참가자 정보가 가려지는 경우와 무관하게, 이 정산 정보는 읽기 전용으로 항상 그대로 제공됩니다. **필수 스코프:** `invoices:read` — 종전에는 `bids:read` 요구했습니다. 대금·계좌가 실리는 응답이라 공고 조회 권한과 분리했습니다. 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
480
+ * 낙찰 공급사의 사업자·계좌 정보와 공급가액·부가세, 응찰 품목내역을 조회합니다. 대금 지급에 필요한 값입니다. 스코프 `invoices:read`(종전 `bids:read`에서 변경). 다른 조회에서 참가자 정보가 가려지는 경우와 무관하게응답은 항상 그대로 나갑니다.
481
481
  * @summary 정산 정보 조회
482
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
483
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
482
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
483
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
484
484
  * @param {*} [options] Override http request option.
485
485
  * @throws {RequiredError}
486
486
  */
@@ -514,11 +514,11 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
514
514
  };
515
515
  }),
516
516
  /**
517
- * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. **필수 스코프:** `invoices:read` — 종전에는 `contracts:read` 를 요구했습니다. 금액이 실리는 정산 계열 문서라 계약서류 조회 권한과 분리했습니다. 이 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
517
+ * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. 스코프 `invoices:read`(종전 `contracts:read`에서 변경).
518
518
  * @summary 거래명세서 조회
519
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
519
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
520
520
  * @param {number} [paperCode] 거래명세서 서식 코드. 생략하면 해당 공고에 적용된 기본 서식으로 조회합니다. 기관에 서식이 여러 벌인 경우에만 지정하세요.
521
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
521
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
522
522
  * @param {*} [options] Override http request option.
523
523
  * @throws {RequiredError}
524
524
  */
@@ -555,10 +555,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
555
555
  };
556
556
  }),
557
557
  /**
558
- * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey` 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName` 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
558
+ * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey`만 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName`에 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
559
559
  * @summary 파일 정보 조회
560
560
  * @param {string} fileKey 파일 키 — 업로드 응답의 fileKey(영문 대소문자·숫자 32자).
561
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
561
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
562
562
  * @param {*} [options] Override http request option.
563
563
  * @throws {RequiredError}
564
564
  */
@@ -625,10 +625,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
625
625
  };
626
626
  }),
627
627
  /**
628
- * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write` 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
628
+ * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write`를 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
629
629
  * @summary 공급사 카드결제 가능 여부
630
630
  * @param {string} memberId 계약업체 회원 ID
631
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
631
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
632
632
  * @param {*} [options] Override http request option.
633
633
  * @throws {RequiredError}
634
634
  */
@@ -662,10 +662,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
662
662
  };
663
663
  }),
664
664
  /**
665
- * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 `endpointId` 확인하세요. **필수 스코프:** `webhooks:read`
665
+ * 구독 1건의 현재 상태를 조회합니다. 스코프 `webhooks:read`. 수정·삭제 전에 먼저 호출해 응답 헤더의 `ETag`를 `If-Match`에 실어야 합니다. 없는 구독이거나 다른 파트너 키의 구독이면 404입니다. 서명 시크릿은 실리지 않습니다.
666
666
  * @summary 웹훅 구독 단건 조회
667
667
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
668
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
668
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
669
669
  * @param {*} [options] Override http request option.
670
670
  * @throws {RequiredError}
671
671
  */
@@ -701,7 +701,7 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
701
701
  /**
702
702
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
703
703
  * @summary Partner API 헬스체크
704
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
704
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
705
705
  * @param {*} [options] Override http request option.
706
706
  * @throws {RequiredError}
707
707
  */
@@ -729,10 +729,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
729
729
  };
730
730
  }),
731
731
  /**
732
- * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. **이 엔드포인트를 폴링에 쓰세요.** 공고를 하나씩 조회하는 대신 최대 100건을 한 왕복으로 받습니다. 응답에 실린 `ETag` 다음 요청의 `If-None-Match` 되보내면, 결과가 그대로일 때 `304` 본문 없이 받습니다. **식별자 전달:** `?bidRefs=A,B,C`(쉼표) 또는 `?bidRefs=A&bidRefs=B`(반복) 둘 다 됩니다. **없는 공고는 응답에서 빠집니다.** 존재하지 않거나 대행 범위 밖인 식별자는 오류가 아니라 누락으로 처리됩니다. 요청한 건수와 받은 건수가 다를 수 있으므로, 보낸 값이 공고번호였다면 `bidId` 로, 구매번호였다면 `purchaseNo` 로 대조하세요. **공고 하나만 볼 때도** `bidRefs` 에 하나만 넣으면 됩니다. 응찰 결과 외에 납품 조건·품목·계약서류까지 필요하면 `GET /v2/bids/{bidRef}` 상세 조회를 쓰세요.
732
+ * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. - 결과 확인은 공고를 하나씩 조회하지 말고 이 엔드포인트로 최대 100건씩 받습니다. 응답의 `ETag`를 다음 요청의 `If-None-Match`로 보내면 변화가 없을본문 없이 `304`로 끝납니다. - 식별자는 `?bidRefs=A,B,C`와 `?bidRefs=A&bidRefs=B` 둘 다 됩니다. - 없거나 대행 범위 밖인 식별자는 오류가 아니라 응답에서 빠집니다. 보낸 값이 공고번호면 `bidId`, 구매번호면 `purchaseNo`로 대조합니다.
733
733
  * @summary 공고 결과 조회
734
- * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60; 반복해 전달합니다. 최대 100건입니다.
735
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
734
+ * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60;를 반복해 전달합니다. 최대 100건입니다.
735
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
736
736
  * @param {*} [options] Override http request option.
737
737
  * @throws {RequiredError}
738
738
  */
@@ -768,14 +768,14 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
768
768
  };
769
769
  }),
770
770
  /**
771
- * 발주처(API 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 다음 요청 `cursor` 전달하면 다음 페이지를 받습니다. `meta.hasMore` `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 관측합니다(AWARDED 상태는 없습니다).
771
+ * API 키에 연결된 발주기관의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. - 발주기관은 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 페이지네이션: `limit`(1~100, 기본 100) `cursor`. 응답 `meta.nextCursor`를 다음 요청의 `cursor`로 보내고, `meta.hasMore`가 `false`면 마지막 페이지입니다. - 낙찰 여부는 공고 상태가 아니라 `GET /v2/bid-results`의 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없습니다.
772
772
  * @summary 공고 목록 조회
773
773
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
774
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달한다. 미지정 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
775
- * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV 로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
774
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 보냅니다. 생략하면페이지이고, &#x60;nextCursor&#x60;가 &#x60;null&#x60;이면 마지막 페이지입니다.
775
+ * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
776
776
  * @param {Array<BidPublicStatus>} [status] 공고 상태 필터(공개값) CSV. 지정 시 그중 하나라도 일치하는 공고만 조회합니다.
777
777
  * @param {Array<ListBidsIncludeEnum>} [include] 행별 확장 부착 CSV. &#x60;results&#x60;&#x3D;응찰 참여자, &#x60;products&#x60;&#x3D;공고 등록 품목, &#x60;contacts&#x60;&#x3D;발주 담당자 성명·연락처·이메일. 미지정이면 부착하지 않는다(응답이 가볍고 조회 비용도 들지 않는다).
778
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
778
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
779
779
  * @param {*} [options] Override http request option.
780
780
  * @throws {RequiredError}
781
781
  */
@@ -821,7 +821,7 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
821
821
  };
822
822
  }),
823
823
  /**
824
- * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market 이 데이터를 채워 PDF 로 만들어 주는 서류입니다. 생성 API 의 `paperCodes` 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
824
+ * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market이 데이터를 채워 PDF로 만들어 주는 서류입니다. 생성 API의 `paperCodes`에 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
825
825
  * @summary 거래에 필요한 계약서류 목록 조회
826
826
  * @param {string} buyerId 발주기관 회원 ID(c-market memberId).
827
827
  * @param {ListExternalContractDocumentsBidTypeEnum} bidType 거래유형.
@@ -862,13 +862,13 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
862
862
  };
863
863
  }),
864
864
  /**
865
- * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 걸러 다시 처리하면 됩니다. - \"이벤트가 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 같고 `attempt` 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 다음 요청의 `cursor` 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
865
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문, 수신측 응답 상태, 다음 재시도 시각이 함께 실립니다. 스코프 `webhooks:read`. - 수신측 장애로 놓친 이벤트는 `status=EXHAUSTED`로 걸러 다시 처리합니다. 웹훅의 폴링 대체 경로입니다. - 재시도마다 한 행이며 `eventId`가 같고 `attempt`만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단합니다. - 페이지네이션: 응답 `nextCursor`를 다음 요청의 `cursor`로 보냅니다. `null`이면 마지막 페이지입니다.
866
866
  * @summary 웹훅 전송 이력 조회
867
867
  * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
868
868
  * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
869
869
  * @param {number} [limit] 페이지 크기(1~200, 기본 50).
870
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달합니다. 미지정 시 첫 페이지.
871
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
870
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 전달합니다. 미지정 시 첫 페이지.
871
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
872
872
  * @param {*} [options] Override http request option.
873
873
  * @throws {RequiredError}
874
874
  */
@@ -911,9 +911,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
911
911
  };
912
912
  }),
913
913
  /**
914
- * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. **호출 시점:** 연동 상태를 점검할 때, 또는 발송이 멈춘 이유(`status`·`consecutiveFailures`)를 확인할 때. 서명 시크릿은 여기에 실리지 않습니다. **필수 스코프:** `webhooks:read` ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 을 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 — JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 을 계산해 **base64** 로 인코딩하고, `webhook-signature` 의 `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 는 공백으로 구분된 **여러 서명**을 실을 수 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** — 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 과 같은 값)도 실립니다 — 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 — 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 로 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 로 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 은 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
914
+ * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. 스코프 `webhooks:read`. 발송이 멈춘 이유는 `status`와 `consecutiveFailures`로 확인합니다. 서명 시크릿은 실리지 않습니다. 수신측 구현 방법은 `POST /v2/webhook-endpoints` 설명에 있습니다.
915
915
  * @summary 웹훅 구독 목록 조회
916
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
916
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
917
917
  * @param {*} [options] Override http request option.
918
918
  * @throws {RequiredError}
919
919
  */
@@ -944,10 +944,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
944
944
  };
945
945
  }),
946
946
  /**
947
- * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(FAILED)로 전환됩니다. - 유찰사유 코드와 상세가 기록됩니다. **유찰사유 값 목록(failureReasonCode 공개값):** | | 의미 | |------|------| | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `OTHER` | 기타 (`failureReasonDetail` 필수) | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수.
947
+ * 공고를 유찰 처리합니다. 입찰 마감 상태에서 호출합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. 공고 상태가 유찰(`FAILED`)로 바뀌고 유찰사유가 기록됩니다. 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). | `failureReasonCode` | 의미 | | --- | --- | | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | | `OTHER` | 기타(`failureReasonDetail` 필수) |
948
948
  * @summary 유찰 처리
949
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
950
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
949
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
950
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
951
951
  * @param {MarkBidFailedRequestDto} markBidFailedRequestDto
952
952
  * @param {*} [options] Override http request option.
953
953
  * @throws {RequiredError}
@@ -988,10 +988,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
988
988
  };
989
989
  }),
990
990
  /**
991
- * 낙찰 결과를 등록합니다. 요청의 응답은 처리 상태 `AWARDED` 반환합니다. **호출 시점:** 입찰 마감 후 낙찰자가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 낙찰자(공급사)의 응찰 건이 낙찰 처리됩니다. - 이후 **공고의 조회 상태(status)는 계약진행(CONTRACT_IN_PROGRESS)** 으로 진행합니다. `AWARDED` 라는 공고 status 존재하지 않으므로, 낙찰 여부는 `GET /v2/bids/{bidRef}/results` 의 `participants[].isWinner` 또는 `GET /v2/bids/{bidRef}` 의 status(=계약진행)로 관측하세요(`status === \'AWARDED\'` 폴링 금지). - 협상 방식(NEGOTIATION/NEGOTIATION_AUTO) 공고는 이 엔드포인트 전에 `POST /v2/bids/{bidRef}/negotiation-scores`(협상 점수평가)로 평가를 완료해야 합니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 24시간 캐시 응답 반환.
991
+ * 낙찰 결과를 등록합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감(입찰완료) 상태에서 호출합니다. - 낙찰 공고 상태는 계약진행(`CONTRACT_IN_PROGRESS`)입니다. `AWARDED` 공고 상태는 없으므로 낙찰 여부는 `participants[].isWinner`로 판단합니다. - 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고는 `POST /v2/bids/{bidRef}/negotiation-scores`로 평가를 마쳐야 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 같은 키와 같은 body 재전송하면 24시간 동안 캐시된 응답을 돌려줍니다.
992
992
  * @summary 낙찰 결과 전송
993
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
994
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
993
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
994
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
995
995
  * @param {RegisterAwardRequestDto} registerAwardRequestDto
996
996
  * @param {*} [options] Override http request option.
997
997
  * @throws {RequiredError}
@@ -1032,9 +1032,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1032
1032
  };
1033
1033
  }),
1034
1034
  /**
1035
- * 입찰 정보 등록. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **첨부는 2단계입니다.** 파일을 요청 본문에 직접 싣지 마세요 먼저 `POST /v2/files`(base64 또는 url)로 올려 `fileKey` 받고, 32자 키를 요청의 `attachments` 배열에 넣습니다.
1035
+ * 공고를 등록합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. 첨부는 방법 하나입니다. - `attachments` 원소에 `{ fileName, url }` 또는 `{ fileName, base64 }`를 그대로 넣습니다. - 여러 공고에서 재사용할 파일은 `POST /v2/files`로 먼저 올려 받은 `fileKey`를 넣습니다.
1036
1036
  * @summary 공고 등록
1037
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1037
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1038
1038
  * @param {CreateBidRequestDto} createBidRequestDto
1039
1039
  * @param {*} [options] Override http request option.
1040
1040
  * @throws {RequiredError}
@@ -1074,7 +1074,7 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1074
1074
  /**
1075
1075
  * 외부에서 맺어진 계약 1건을 씨마켓의 **세금계산서 발행 대상**으로 등록합니다. **등록 후 동선:** 발주기관이 씨마켓 [나의 계약 관리] 에서 계산서 발급을 요청하고, 공급기업이 같은 화면에서 발행합니다. 계산서의 **공급자는 공급기업, 공급받는자는 발주기관**입니다. **대금 흐름:** 씨마켓은 이 거래의 대금을 받지 않습니다 — 발행 경로만 제공합니다. **금액:** `supplyPrice` 는 **부가세를 뺀 과세 공급가액**입니다(결제창 API 가 부가세 포함가를 받는 것과 다릅니다). 과세·면세 공급가액이 모두 0 이면 400 입니다. **사전 조건:** 두 회원 ID 가 씨마켓에 실재해야 합니다. 회원 ID 가 곧 소유권이라, 없는 회원으로 등록하면 아무도 열 수 없는 계산서 대상이 됩니다. **필수 스코프:** `contracts:write`. 바인딩된 발주처 외의 발주기관을 대신하려면 대행 범위에 그 회원이 있어야 합니다. **멱등성:** `externalContractId` 가 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 대상을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
1076
1076
  * @summary 계약 발행대상 등록
1077
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1077
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1078
1078
  * @param {RegisterSemoContractRequestDto} registerSemoContractRequestDto
1079
1079
  * @param {*} [options] Override http request option.
1080
1080
  * @throws {RequiredError}
@@ -1112,10 +1112,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1112
1112
  };
1113
1113
  }),
1114
1114
  /**
1115
- * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write`. **청구만 접수합니다.** 호출이 계산서를 발행하지는 않습니다 접수된 청구는 정산 파이프라인이 처리하며, 진행 여부는 `GET /v2/bids/{bidRef}` `taxInvoiceRequested` 관측합니다. **나눠 담을 금액을 보냅니다.** `supplyAmount`(공급가액)와 `vat`(부가세)는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 같은 공고에 청구를 한 번 더 보냅니다 — 그때는 **새 `Idempotency-Key`** 쓰세요. 같은 키로 다시 보내면 앞선 청구의 응답이 그대로 재생됩니다. **발급 희망일**(`issueDate`)은 선택이며 미래 일자는 400 입니다. 미지정 시 서버 기본값을 씁니다.
1115
+ * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write` · `Idempotency-Key` 헤더 필수. - 청구만 접수합니다. 발행은 정산 파이프라인이 처리하며 진행 여부는 `GET /v2/bids/{bidRef}`의 `taxInvoiceRequested`로 확인합니다. - `supplyAmount`와 `vat`는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 **새 `Idempotency-Key`**로 청구합니다. 같은 키는 앞선 청구의 응답을 그대로 돌려줍니다. - `issueDate`는 선택이며 미래 일자는 400입니다.
1116
1116
  * @summary 계산서 분할 발급 청구
1117
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1118
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1117
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1118
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1119
1119
  * @param {RequestInvoiceSplitRequestDto} requestInvoiceSplitRequestDto
1120
1120
  * @param {*} [options] Override http request option.
1121
1121
  * @throws {RequiredError}
@@ -1158,8 +1158,8 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1158
1158
  /**
1159
1159
  * 확정된 낙찰을 되돌려 공고를 낙찰대기(PENDING_AWARD) 상태로 보냅니다. 스코프 `awards:write` + `Idempotency-Key` 헤더 필수. **호출 시점:** 낙찰자가 계약을 포기했거나 낙찰 처리 자체가 잘못됐을 때. 되돌린 뒤 같은 공고에 다시 낙찰을 등록할 수 있습니다. **되돌릴 수 없는 경우 → 409:** - 수수료 결제가 이미 완료된 공고 - 세금계산서가 이미 발행된 공고 - 수입권공매 계열 낙찰방법(다수 낙찰자 구조라 되돌리기 단위가 다릅니다) **사유는 필수입니다** — 감사 대상 행위이며 공고 이력에 남습니다. **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
1160
1160
  * @summary 낙찰 되돌리기
1161
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1162
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1161
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1162
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1163
1163
  * @param {RevertAwardRequestDto} revertAwardRequestDto
1164
1164
  * @param {*} [options] Override http request option.
1165
1165
  * @throws {RequiredError}
@@ -1200,10 +1200,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1200
1200
  };
1201
1201
  }),
1202
1202
  /**
1203
- * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
1203
+ * 서명 시크릿을 새로 발급합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 시크릿은 이 응답에서 한 번만 나가고 `secretVersion`이 1 올라갑니다. - **옛 시크릿은 즉시 무효입니다.** 유예가 없으므로 순서를 지키세요 — ① 수신측이 옛 값과 새 값을 모두 받아들이도록 배포 → ② 이 호출 → ③ 새 반영 → ④ 옛 값 제거. - 같은 `Idempotency-Key`로 다시 부르면 새로 발급하지 않고 처음 발급한 값을 돌려줍니다(24시간).
1204
1204
  * @summary 웹훅 서명 시크릿 재발급
1205
1205
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1206
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1206
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1207
1207
  * @param {*} [options] Override http request option.
1208
1208
  * @throws {RequiredError}
1209
1209
  */
@@ -1239,10 +1239,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1239
1239
  };
1240
1240
  }),
1241
1241
  /**
1242
- * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` `delivered: false` 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
1242
+ * 등록된 주소로 `ping` 이벤트를 1회 보내고 결과를 돌려줍니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 수신측이 받지 못해도 응답은 200이고 `delivered: false`입니다. 원인은 `responseStatus`와 `error`로 좁힙니다. - 실제 이벤트와 같은 서명 헤더가 실리므로 검증 코드를 그대로 시험할 수 있습니다. - 다시 보내려면 `Idempotency-Key`를 쓰세요. 같은 키는 24시간 동안 직전 결과를 돌려줍니다.
1243
1243
  * @summary 웹훅 연결 확인 발송
1244
1244
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1245
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1245
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1246
1246
  * @param {*} [options] Override http request option.
1247
1247
  * @throws {RequiredError}
1248
1248
  */
@@ -1278,10 +1278,10 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1278
1278
  };
1279
1279
  }),
1280
1280
  /**
1281
- * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
1281
+ * 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고의 응찰자별 점수를 입력합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전에 호출합니다. 협상 방식 공고는 이 평가를 마쳐야 낙찰에 진입합니다. - `complete=true`면 평가완료로 처리되어 낙찰을 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다).
1282
1282
  * @summary 협상 점수평가
1283
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1284
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1283
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1284
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1285
1285
  * @param {SubmitNegotiationScoresRequestDto} submitNegotiationScoresRequestDto
1286
1286
  * @param {*} [options] Override http request option.
1287
1287
  * @throws {RequiredError}
@@ -1322,11 +1322,11 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1322
1322
  };
1323
1323
  }),
1324
1324
  /**
1325
- * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. 진행중/초안 상태의 공고만 수정할 수 있습니다. **부수효과:** - 변경 내용이 반영되고 수정이력이 기록됩니다. - `hideEditHistory=true` 면 변경이력을 비공개 처리하고 노출 카운터 증가를 생략합니다. **수정 제약:** - 낙찰방법(awardMethod)은 수정 불가(잠금). - 참여자가 있으면 입찰방식/면허/예산/품목 일부가 잠깁니다. - 마감/취소된 공고는 수정할 수 없습니다. 한 섹션을 수정하려면 해당 섹션의 필수 필드를 함께 보내야 합니다(부분 섹션은 거부됨).
1325
+ * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 진행중·초안 상태만 수정할 수 있습니다. 마감·취소된 공고는 거부됩니다. - 낙찰방법(`awardMethod`)은 수정할 없고, 참여자가 있으면 입찰방식·면허·예산·품목 일부가 잠깁니다. - 한 섹션을 수정하려면 섹션의 필수 필드를 함께 보냅니다. - `hideEditHistory=true`면 변경이력을 비공개로 남기고 노출 카운터를 올리지 않습니다.
1326
1326
  * @summary 공고 수정
1327
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1328
- * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412 로 거절되며 아무것도 수정되지 않습니다.
1329
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1327
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1328
+ * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412로 거절되며 아무것도 수정되지 않습니다.
1329
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1330
1330
  * @param {UpdateBidRequestDto} updateBidRequestDto
1331
1331
  * @param {*} [options] Override http request option.
1332
1332
  * @throws {RequiredError}
@@ -1372,11 +1372,11 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1372
1372
  };
1373
1373
  }),
1374
1374
  /**
1375
- * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 헤더가 없으면 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` 헤더를 빼먹었습니다. 조회 `ETag` 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1375
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - `eventTypes`는 치환입니다. 하나를 더하려면 기존 목록을 포함한 전체를 보냅니다. - `If-Match`가 필수입니다. `GET`으로 받은 `ETag`를 그대로 실으세요. 누락은 428, 사이 구독이 바뀌었으면 412이며 아무것도 수정되지 않습니다. - 연속 실패로 자동 중지된 구독은 `{\"status\":\"ACTIVE\"}`로 되살립니다. - 시크릿은 이 경로로 바뀌지 않습니다. 재발급은 `rotate-secret`입니다.
1376
1376
  * @summary 웹훅 구독 수정
1377
1377
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1378
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
1379
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1378
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
1379
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1380
1380
  * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
1381
1381
  * @param {*} [options] Override http request option.
1382
1382
  * @throws {RequiredError}
@@ -1422,9 +1422,9 @@ const PartnerApiApiAxiosParamCreator = function (configuration) {
1422
1422
  };
1423
1423
  }),
1424
1424
  /**
1425
- * **첨부 업로드의 기본 경로입니다. 23MB 이하면 호출 하나로 끝납니다.** 파일 본문을 `base64` 또는 `url` 중 정확히 하나로 제출하면 `fileKey` 를 돌려줍니다. 이 값을 공고 등록·수정의 첨부 필드에 실으세요. **23MB 를 넘으면 경로를 바꿔야 합니다.** 상한이 셋으로 갈립니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | **23MB** (본문이 c-market 을 통과하며 base64 팽창 4/3 이 얹힘) | 1 | | 이 호출 + `url` | **30MB** (c-market 이 대신 내려받아 팽창은 없지만 서버 경유 천장은 그대로) | 1 | | `POST /v2/files/upload-url` 로 시작하는 2단계 | **100MB** (바이트가 c-market 을 지나지 않음) | 2 + 스토리지 PUT | c-market 내려받을 있는 https 주소에 파일을 올려 둘 수 있다면 `url` 이 30MB 까지를 1콜로 덮습니다. 그 이상이거나 주소를 열 수 없으면 2단계 경로를 쓰세요. **공고 등록에 파일을 함께 실을 수도 있습니다.** `POST /v2/bids` `attachments` 원소에 `{ fileName, url }`·`{ fileName, base64 }` 그대로 넣으면 호출 없이 번에 끝납니다. 여러 공고에 같은 파일을 재사용하거나 큰 파일을 다룰 때만 `fileKey` 를 먼저 만드세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1425
+ * 공고 첨부파일을 올리고 `fileKey`를 받습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. `base64`와 `url` 중 하나만 보냅니다. 받은 `fileKey`는 공고 등록·수정의 `attachments`에 넣습니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | 23MB | 1 | | 이 호출 + `url` | 30MB | 1 | | `POST /v2/files/upload-url` 2단계 | 100MB | 2 + 스토리지 PUT | 공고에만 쓰는 파일이면 `POST /v2/bids`의 `attachments`에 `url`·`base64`를 직접 넣어호출을 생략할 있습니다.
1426
1426
  * @summary 공고 첨부파일 업로드 (기본)
1427
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1427
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1428
1428
  * @param {UploadFileRequestDto} uploadFileRequestDto
1429
1429
  * @param {*} [options] Override http request option.
1430
1430
  * @throws {RequiredError}
@@ -1471,10 +1471,10 @@ const PartnerApiApiFp = function (configuration) {
1471
1471
  const localVarAxiosParamCreator = (0, exports.PartnerApiApiAxiosParamCreator)(configuration);
1472
1472
  return {
1473
1473
  /**
1474
- * 진행중인 공고를 취소합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **되돌릴없습니다.** 취소 사유는 필수이며 공고 이력에 남습니다. **전제조건:** 진행중(ONGOING) 상태여야 합니다. **거부:** 진행중이 아니거나 이미 취소된 공고 409. 발주처 공고 403. **마감과의 차이:** 취소는 공고를 무효로 되돌리는 것이고, 유찰(`POST /v2/bids/{bidRef}/fail`)은 응찰을 받았으나 낙찰자를 정하지 못한 종료입니다.
1474
+ * 진행중(`ONGOING`) 공고를 취소합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 되돌릴 없습니다. 취소 사유는 필수이고 공고 이력에 남습니다. - 진행중이 아니거나 이미 취소된 공고는 409, 다른 발주기관의 공고는 403입니다. - 응찰은 받았으나 낙찰자를 정하지 못한 종료는 취소가 아니라 유찰(`POST /v2/bids/{bidRef}/fail`)입니다.
1475
1475
  * @summary 공고 취소
1476
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1477
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1476
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1477
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1478
1478
  * @param {CancelBidRequestDto} cancelBidRequestDto
1479
1479
  * @param {*} [options] Override http request option.
1480
1480
  * @throws {RequiredError}
@@ -1489,10 +1489,10 @@ const PartnerApiApiFp = function (configuration) {
1489
1489
  });
1490
1490
  },
1491
1491
  /**
1492
- * 낙찰 공고의 검수(납품 검수)가 완료되었음을 기록합니다. **호출 시점:** 낙찰자(공급사)가 납품을 완료하고 구매자가 검수를 확인한 시점입니다. 공고 상태가 낙찰(AWARDED) 상태여야 합니다. **부수효과:** - 검수완료 상태가 기록됩니다. - 현금 결제 공고는 세금계산서 발행요청이 등록되고, 낙찰자(공급사)에게 발행요청 알림·문자가 발송됩니다. 카드 결제 공고는 발행요청 축이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 응답 코드는 200이며, 처리 결과가 본문에 담겨 반환됩니다. **부분계약(협의 감액):** 낙찰 후 협의로 계약금액이 줄었으면 `supplyAmount`+`vat` 함께 보내세요. 그 금액으로 계산서 발행이 요청됩니다. 생략하면 낙찰금액에서 파생합니다. 현금 결제 공고·낙찰자 1인·감액(증액 불가)일 때만 허용되며, 어긋나면 409 입니다. **문서에 찍히는 값:** 거래명세서·검수보고서의 구매사 사업자정보·담당자·작성일자는 등록된 발주처 정보에서 채워집니다. 요청으로 덮어쓸 수 없습니다. **낙찰자:** 공고의 낙찰 상태에서 결정되며 요청으로 지정하지 않습니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1492
+ * 납품 검수 완료를 기록합니다. 낙찰 처리된 공고에서 호출합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 현금 결제 공고는 세금계산서 발행요청이 등록되고 낙찰자에게 알림·문자가 나갑니다. 카드 결제 공고는 발행요청이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 협의로 계약금액이 줄었으면 `supplyAmount`와 `vat`를 함께 보냅니다. 현금 결제·낙찰자 1인·감액일 때만 허용하며 어긋나면 409입니다. 생략하면 낙찰금액에서 파생합니다. - 문서에 찍히는 구매사 사업자정보·담당자·작성일자와 낙찰자는 등록된 값에서 채워지며 요청으로 바꿀 수 없습니다.
1493
1493
  * @summary 검수완료 전송
1494
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1495
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1494
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1495
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1496
1496
  * @param {CompleteAcceptanceRequestDto} completeAcceptanceRequestDto
1497
1497
  * @param {*} [options] Override http request option.
1498
1498
  * @throws {RequiredError}
@@ -1507,10 +1507,10 @@ const PartnerApiApiFp = function (configuration) {
1507
1507
  });
1508
1508
  },
1509
1509
  /**
1510
- * `uploadUrl` 로의 `PUT` 이 끝난 뒤 호출합니다. 올라온 파일을 실측해 등록하고, 시점부터 `fileKey` 공고 첨부로 쓸 수 있습니다. **확정 `fileKey` 첨부로 없습니다** 공고 등록이 400 으로 거절됩니다. **신고한 크기가 아니라 실제 파일을 봅니다.** 발급 요청의 `fileSize` 와 다르면 실제 크기가 기록되고, 정책 상한을 넘으면 여기서 거절됩니다. **같은 `fileKey` 여러 번 호출해도 안전합니다**(멱등). **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1510
+ * `uploadUrl`로 올린 파일을 확정합니다. 시점부터 `fileKey`를 공고 첨부로 쓸 수 있습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. - 확정 `fileKey`를 첨부로 쓰면 공고 등록이 400입니다. - 신고한 `fileSize`가 아니라 실제 파일을 측정해 기록하며, 정책 상한을 넘으면 여기서 거절됩니다. - 같은 `fileKey`로 여러 번 호출해도 안전합니다.
1511
1511
  * @summary 대용량 업로드 2/2 — 업로드 확정
1512
1512
  * @param {string} fileKey 발급 응답의 fileKey(영문 대소문자·숫자 32자).
1513
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1513
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1514
1514
  * @param {CompleteUploadRequestDto} completeUploadRequestDto
1515
1515
  * @param {*} [options] Override http request option.
1516
1516
  * @throws {RequiredError}
@@ -1525,10 +1525,10 @@ const PartnerApiApiFp = function (configuration) {
1525
1525
  });
1526
1526
  },
1527
1527
  /**
1528
- * 공급사로부터 계산서를 수령한 뒤, 계약을 완료처리 상태로 강제 전환합니다. **호출 시점:** 낙찰·계약 완료 후 공급사 계산서를 오프라인으로 수령했을 때. **부수효과:** - 결제완료·계산서 발급 상태가 기록되고 발급일자가 현재 시각으로 설정됩니다. **소유권:** 공고는 요청 파트너 키가 소유한 발주처 명의여야 합니다(타 발주처 공고 → 403). **이미 완료:** 이미 완료처리된 공고 재호출 → 409. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1528
+ * 공급사에게 계산서를 수령한 계약을 완료처리합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 결제완료·계산서 발급 상태가 기록되고 발급일자는 현재 시각이 됩니다. - 이미 완료된 공고는 409, 다른 발주기관의 공고는 403입니다.
1529
1529
  * @summary 정산 마감
1530
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1531
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1530
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1531
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1532
1532
  * @param {*} [options] Override http request option.
1533
1533
  * @throws {RequiredError}
1534
1534
  */
@@ -1542,9 +1542,9 @@ const PartnerApiApiFp = function (configuration) {
1542
1542
  });
1543
1543
  },
1544
1544
  /**
1545
- * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable` 미리 확인하세요. 미가입 업체로 발행하면 400 입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
1545
+ * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable`로 미리 확인하세요. 미가입 업체로 발행하면 400입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
1546
1546
  * @summary 결제창 발행
1547
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1547
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1548
1548
  * @param {CreateCardPaymentDto} createCardPaymentDto
1549
1549
  * @param {*} [options] Override http request option.
1550
1550
  * @throws {RequiredError}
@@ -1559,9 +1559,9 @@ const PartnerApiApiFp = function (configuration) {
1559
1559
  });
1560
1560
  },
1561
1561
  /**
1562
- * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
1562
+ * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
1563
1563
  * @summary 계약서류 생성
1564
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1564
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1565
1565
  * @param {CreateExternalContractDocumentsRequestDto} createExternalContractDocumentsRequestDto
1566
1566
  * @param {*} [options] Override http request option.
1567
1567
  * @throws {RequiredError}
@@ -1576,9 +1576,9 @@ const PartnerApiApiFp = function (configuration) {
1576
1576
  });
1577
1577
  },
1578
1578
  /**
1579
- * 파일 본문을 스토리지로 **직접** 올리기 위한 1회용 서명 URL 발급합니다. 3단계로 씁니다. 1. 이 호출로 `fileKey` `uploadUrl` 받습니다. 2. `uploadUrl` 파일 본문을 `PUT` 합니다 응답의 `contentType` `Content-Type` 헤더에 그대로 실으세요. 요청은 c-market 거치지 않습니다. 3. `POST /v2/files/{fileKey}/complete` 확정합니다. **2단계는 이 명세에 오퍼레이션으로 나오지 않습니다** — 요청이 c-market 이 아니라 스토리지로 가기 때문입니다. 형태는 이게 전부입니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` ```ts import { readFile } from \'node:fs/promises\'; // 본문은 **파일 바이트 그대로**입니다 — JSON 도 multipart 도 아닙니다. await fetch(uploadUrl, { method: \'PUT\', headers: { \'Content-Type\': contentType }, body: await readFile(\'시방서.pdf\'), }); ``` **`Authorization` 헤더를 붙이지 마세요.** 자격증명이 `uploadUrl` 안에 서명으로 들어 있어 별도 인증이 필요 없습니다. 같은 이유로 주소는 **주소 자체가 자격증명**이므로 로그에 남기지 마세요. **2단계의 실패 응답은 problem+json 아닙니다.** 스토리지가 직접 답하므로 본문 형식이 다릅니다 — c-market 에러 파서에 넣지 마세요. 만료(`400`)·중복 업로드(`409`)라면 1단계부터 다시 하세요. **`POST /v2/files` 와 언제 갈리나:** 기본은 `POST /v2/files` 한 번입니다 — `base64` 로 23MB, `url` 로 30MB 까지 그 한 번으로 끝납니다. 그 위(**100MB** 까지)만 이 2단계 경로를 쓰세요. 바이트가 c-market 을 지나지 않아 서버 경유 천장을 받지 않습니다. **`uploadUrl` 1회용입니다.** 덮어쓰기가 막혀 있고 `expiresIn` 만료됩니다 저장해 두고 재사용하지 마시고, 만료됐다면 호출부터 다시 하세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1579
+ * 파일을 스토리지로 직접 올리기 위한 1회용 서명 URL을 발급합니다(100MB까지). 스코프 `files:write` · `Idempotency-Key` 헤더 필수. 1. 이 호출로 `fileKey`와 `uploadUrl`을 받습니다. 2. `uploadUrl`에 파일 바이트를 그대로 `PUT` 합니다. 응답의 `contentType`을 `Content-Type` 헤더에 싣고, `Authorization` 헤더는 붙이지 않습니다(주소 자체가 자격증명입니다). 3. `POST /v2/files/{fileKey}/complete`로 확정합니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` - 2단계는 요청이 스토리지로 가므로명세에 오퍼레이션이 없고, 실패 본문도 problem+json이 아닙니다. 만료(400)·중복 업로드(409) 1단계부터 다시 합니다. - `uploadUrl`은 1회용이며 `expiresIn`초만료됩니다. 주소가 자격증명이므로 로그에 남기지 않습니다. - 30MB 이하는 `POST /v2/files` 번으로 끝납니다.
1580
1580
  * @summary 대용량 업로드 1/2 — 업로드 주소 발급
1581
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1581
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1582
1582
  * @param {CreateUploadUrlRequestDto} createUploadUrlRequestDto
1583
1583
  * @param {*} [options] Override http request option.
1584
1584
  * @throws {RequiredError}
@@ -1593,9 +1593,9 @@ const PartnerApiApiFp = function (configuration) {
1593
1593
  });
1594
1594
  },
1595
1595
  /**
1596
- * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 1회. 수신 주소가 바뀌면 새로 만들지 말고 `PATCH` 고치세요 — 그래야 시크릿과 전송 이력이 유지됩니다. **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 응답의 `secret` 을 즉시 안전한 곳에 보관하세요. 잃어버렸다면 복구가 아니라 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret` 으로 **재발급**해야 합니다. **거절되는 경우와 고치는 법:** - `400` `url` HTTPS 아니거나 형식이 잘못됨, `eventTypes` 비었거나 목록 값 (`ping` 은 구독 불가). 값을 고쳐 재시도하세요. - `400` `Idempotency-Key` 헤더 누락/형식 오류. UUID v4 를 실어 보내세요. - `403` 토큰에 `webhooks:write` 스코프가 없음. 키 발급 설정을 넓혀야 합니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 — 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 계산해 **base64** 인코딩하고, `webhook-signature` `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 공백으로 구분된 **여러 서명**을 실을 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 같은 값)도 실립니다 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
1596
+ * 수신 주소와 구독할 이벤트를 등록합니다. 연동 초기 1 호출합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 잃어버렸다면 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret`으로 재발급합니다. - 수신 주소가 바뀌면 새로 만들지 말고 `PATCH`로 고치세요. 시크릿과 전송 이력이 유지됩니다. - `url`은 HTTPS만 허용하고 `eventTypes`는 아래 목록 안의 값이어야 합니다. 어기면 400입니다. ### 서명 검증 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약입니다. 직접 짜지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿(`whsec_…`)을 그대로 넘기세요. ```ts import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); // 실패하면 예외 ``` 라이브러리를 쓸 수 없다면 헤더 셋으로 직접 검증합니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 base64 디코드한 바이트가 HMAC 키입니다. 2. `{webhook-id}.{webhook-timestamp}.{본문}`을 연결합니다. 본문은 **파싱 전 원문 바이트**여야 합니다. JSON을 다시 직렬화하면 순서·공백이 달라져 서명이 어긋납니다. 3. HMAC-SHA256을 base64로 인코딩해 `webhook-signature`의 `v1,` 뒤 값과 상수 시간 함수로 비교합니다. 4. `webhook-timestamp`가 5 이상 지났으면 거절합니다. `webhook-signature`에는 서명이 여러 실릴있으므로(키 회전용) 하나라도 맞으면 통과로 처리하세요. ### 중복 제거 `webhook-id`가 이벤트 식별자입니다. 재시도에도 같은 값이 오므로 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상이며 중복 제거는 수신측 책임입니다. `webhook-event-type` 헤더에 본문 `type`과 같은 값이 실려, 본문을 파싱하기 전에 거를 수 있습니다. ### 재시도와 자동 중지 2xx를 돌려주면 성공입니다. 그 외에는 최대 7회 재시도하며 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간입니다. 처리가 길면 먼저 2xx를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 `DISABLED`로 내려갑니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}`에 `{\"status\":\"ACTIVE\"}`로 되살리세요. ### 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping`은 연결 확인 전용이라 구독할 수 없습니다. 놓친 이벤트는 `GET /v2/webhook-deliveries`로 조회해 메웁니다.
1597
1597
  * @summary 웹훅 구독 등록
1598
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1598
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1599
1599
  * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
1600
1600
  * @param {*} [options] Override http request option.
1601
1601
  * @throws {RequiredError}
@@ -1610,11 +1610,11 @@ const PartnerApiApiFp = function (configuration) {
1610
1610
  });
1611
1611
  },
1612
1612
  /**
1613
- * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH {\"status\":\"DISABLED\"}` 쓰세요 시크릿과 이벤트 구성이 남아 그대로 되살릴 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1613
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 되돌릴없습니다. 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. 잠시만 멈추려면 `PATCH`로 `{\"status\":\"DISABLED\"}`를 보내세요. - `If-Match`가 필수입니다. 누락은 428, 그 사이 구독이 바뀌었으면 412입니다.
1614
1614
  * @summary 웹훅 구독 삭제
1615
1615
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1616
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
1617
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1616
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
1617
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1618
1618
  * @param {*} [options] Override http request option.
1619
1619
  * @throws {RequiredError}
1620
1620
  */
@@ -1628,9 +1628,9 @@ const PartnerApiApiFp = function (configuration) {
1628
1628
  });
1629
1629
  },
1630
1630
  /**
1631
- * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`URL 을 가리킨다. 요청 시점에 서명하므로 URL 을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}` 파일 메타와 `downloadUrl` v2 응답 규약으로 돌려줍니다. 이 안정 URL 은 파트너 응답의 `fileUrl`/`fullUrl` 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
1631
+ * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`이 이 URL을 가리킨다. 요청 시점에 서명하므로 URL을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}`가 파일 메타와 `downloadUrl`을 v2 응답 규약으로 돌려줍니다. 이 안정 URL은 파트너 응답의 `fileUrl`/`fullUrl`이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
1632
1632
  * @summary 파일 다운로드
1633
- * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다.
1633
+ * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다.
1634
1634
  * @param {*} [options] Override http request option.
1635
1635
  * @throws {RequiredError}
1636
1636
  */
@@ -1644,10 +1644,10 @@ const PartnerApiApiFp = function (configuration) {
1644
1644
  });
1645
1645
  },
1646
1646
  /**
1647
- * 공고의 모든 정보를 번에 조회합니다 — 기본 정보·납품/대금 조건·담당자·품목, 응찰 참여자(투찰가·순위·낙찰 여부), 계약서류, 검수 진행 상태, 라이프사이클 하위 상태. 스코프 `bids:read`. ERP 는 이 엔드포인트를 폴링해 async 처리(정산 마감 등)의 성사를 관측합니다. **낙찰 여부:** 응답의 `status` 아니라 `participants[].isWinner` 관측합니다. AWARDED 라는 공고 상태는 존재하지 않으며(낙찰 직후 공고는 CONTRACT_IN_PROGRESS 로 전이) `status === \'AWARDED\'` 기다리면 영원히 도달하지 않습니다. **여러 건을 한 번에:** 공고마다 이 조회를 반복하지 말고 `GET /v2/bid-results` 배치 조회를 쓰세요. **계약서류는 이 응답에 실립니다.** `contractDocuments[]` 서류별 `paperCode`·`paperName`· `fileKey`·`downloadUrl`·`uploadedAt`·`winnerSequence` 를 담습니다 — 계약서류만 따로 받는 엔드포인트는 두지 않습니다. `generationState` **관측 전용**이며 `DEAD_LETTER` 보이면 자동 재시도가 소진된 상태라 API 되살릴 수 없습니다(운영에 문의하세요). **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
1647
+ * 공고 건의 전체 정보를 조회합니다 — 기본 정보, 납품·대금 조건, 담당자, 품목, 응찰 참여자, 계약서류, 검수 상태. 스코프 `bids:read`. - 낙찰 여부는 `status`가 아니라 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없어(낙찰 직후 `CONTRACT_IN_PROGRESS`) `status === \'AWARDED\'` 폴링은 끝나지 않습니다. - 계약서류는 `contractDocuments[]`에 실립니다. 따로 받는 엔드포인트는 없습니다. - 여러 건은 `GET /v2/bid-results`로 번에 받습니다. - 다른 발주기관의 공고는 403입니다.
1648
1648
  * @summary 공고 상세 조회
1649
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1650
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1649
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1650
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1651
1651
  * @param {*} [options] Override http request option.
1652
1652
  * @throws {RequiredError}
1653
1653
  */
@@ -1661,10 +1661,10 @@ const PartnerApiApiFp = function (configuration) {
1661
1661
  });
1662
1662
  },
1663
1663
  /**
1664
- * 낙찰 공급사의 사업자·계좌·공급가액/부가세·응찰 품목내역을 조회합니다. 대금 지급에 필요한 정보입니다. 다른 조회에서 일부 참가자 정보가 가려지는 경우와 무관하게, 이 정산 정보는 읽기 전용으로 항상 그대로 제공됩니다. **필수 스코프:** `invoices:read` — 종전에는 `bids:read` 요구했습니다. 대금·계좌가 실리는 응답이라 공고 조회 권한과 분리했습니다. 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
1664
+ * 낙찰 공급사의 사업자·계좌 정보와 공급가액·부가세, 응찰 품목내역을 조회합니다. 대금 지급에 필요한 값입니다. 스코프 `invoices:read`(종전 `bids:read`에서 변경). 다른 조회에서 참가자 정보가 가려지는 경우와 무관하게응답은 항상 그대로 나갑니다.
1665
1665
  * @summary 정산 정보 조회
1666
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1667
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1666
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1667
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1668
1668
  * @param {*} [options] Override http request option.
1669
1669
  * @throws {RequiredError}
1670
1670
  */
@@ -1678,11 +1678,11 @@ const PartnerApiApiFp = function (configuration) {
1678
1678
  });
1679
1679
  },
1680
1680
  /**
1681
- * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. **필수 스코프:** `invoices:read` — 종전에는 `contracts:read` 를 요구했습니다. 금액이 실리는 정산 계열 문서라 계약서류 조회 권한과 분리했습니다. 이 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
1681
+ * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. 스코프 `invoices:read`(종전 `contracts:read`에서 변경).
1682
1682
  * @summary 거래명세서 조회
1683
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1683
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1684
1684
  * @param {number} [paperCode] 거래명세서 서식 코드. 생략하면 해당 공고에 적용된 기본 서식으로 조회합니다. 기관에 서식이 여러 벌인 경우에만 지정하세요.
1685
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1685
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1686
1686
  * @param {*} [options] Override http request option.
1687
1687
  * @throws {RequiredError}
1688
1688
  */
@@ -1696,10 +1696,10 @@ const PartnerApiApiFp = function (configuration) {
1696
1696
  });
1697
1697
  },
1698
1698
  /**
1699
- * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey` 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName` 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
1699
+ * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey`만 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName`에 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
1700
1700
  * @summary 파일 정보 조회
1701
1701
  * @param {string} fileKey 파일 키 — 업로드 응답의 fileKey(영문 대소문자·숫자 32자).
1702
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1702
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1703
1703
  * @param {*} [options] Override http request option.
1704
1704
  * @throws {RequiredError}
1705
1705
  */
@@ -1729,10 +1729,10 @@ const PartnerApiApiFp = function (configuration) {
1729
1729
  });
1730
1730
  },
1731
1731
  /**
1732
- * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write` 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
1732
+ * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write`를 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
1733
1733
  * @summary 공급사 카드결제 가능 여부
1734
1734
  * @param {string} memberId 계약업체 회원 ID
1735
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1735
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1736
1736
  * @param {*} [options] Override http request option.
1737
1737
  * @throws {RequiredError}
1738
1738
  */
@@ -1746,10 +1746,10 @@ const PartnerApiApiFp = function (configuration) {
1746
1746
  });
1747
1747
  },
1748
1748
  /**
1749
- * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 `endpointId` 확인하세요. **필수 스코프:** `webhooks:read`
1749
+ * 구독 1건의 현재 상태를 조회합니다. 스코프 `webhooks:read`. 수정·삭제 전에 먼저 호출해 응답 헤더의 `ETag`를 `If-Match`에 실어야 합니다. 없는 구독이거나 다른 파트너 키의 구독이면 404입니다. 서명 시크릿은 실리지 않습니다.
1750
1750
  * @summary 웹훅 구독 단건 조회
1751
1751
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1752
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1752
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1753
1753
  * @param {*} [options] Override http request option.
1754
1754
  * @throws {RequiredError}
1755
1755
  */
@@ -1765,7 +1765,7 @@ const PartnerApiApiFp = function (configuration) {
1765
1765
  /**
1766
1766
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
1767
1767
  * @summary Partner API 헬스체크
1768
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1768
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1769
1769
  * @param {*} [options] Override http request option.
1770
1770
  * @throws {RequiredError}
1771
1771
  */
@@ -1779,10 +1779,10 @@ const PartnerApiApiFp = function (configuration) {
1779
1779
  });
1780
1780
  },
1781
1781
  /**
1782
- * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. **이 엔드포인트를 폴링에 쓰세요.** 공고를 하나씩 조회하는 대신 최대 100건을 한 왕복으로 받습니다. 응답에 실린 `ETag` 다음 요청의 `If-None-Match` 되보내면, 결과가 그대로일 때 `304` 본문 없이 받습니다. **식별자 전달:** `?bidRefs=A,B,C`(쉼표) 또는 `?bidRefs=A&bidRefs=B`(반복) 둘 다 됩니다. **없는 공고는 응답에서 빠집니다.** 존재하지 않거나 대행 범위 밖인 식별자는 오류가 아니라 누락으로 처리됩니다. 요청한 건수와 받은 건수가 다를 수 있으므로, 보낸 값이 공고번호였다면 `bidId` 로, 구매번호였다면 `purchaseNo` 로 대조하세요. **공고 하나만 볼 때도** `bidRefs` 에 하나만 넣으면 됩니다. 응찰 결과 외에 납품 조건·품목·계약서류까지 필요하면 `GET /v2/bids/{bidRef}` 상세 조회를 쓰세요.
1782
+ * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. - 결과 확인은 공고를 하나씩 조회하지 말고 이 엔드포인트로 최대 100건씩 받습니다. 응답의 `ETag`를 다음 요청의 `If-None-Match`로 보내면 변화가 없을본문 없이 `304`로 끝납니다. - 식별자는 `?bidRefs=A,B,C`와 `?bidRefs=A&bidRefs=B` 둘 다 됩니다. - 없거나 대행 범위 밖인 식별자는 오류가 아니라 응답에서 빠집니다. 보낸 값이 공고번호면 `bidId`, 구매번호면 `purchaseNo`로 대조합니다.
1783
1783
  * @summary 공고 결과 조회
1784
- * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60; 반복해 전달합니다. 최대 100건입니다.
1785
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1784
+ * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60;를 반복해 전달합니다. 최대 100건입니다.
1785
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1786
1786
  * @param {*} [options] Override http request option.
1787
1787
  * @throws {RequiredError}
1788
1788
  */
@@ -1796,14 +1796,14 @@ const PartnerApiApiFp = function (configuration) {
1796
1796
  });
1797
1797
  },
1798
1798
  /**
1799
- * 발주처(API 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 다음 요청 `cursor` 전달하면 다음 페이지를 받습니다. `meta.hasMore` `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 관측합니다(AWARDED 상태는 없습니다).
1799
+ * API 키에 연결된 발주기관의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. - 발주기관은 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 페이지네이션: `limit`(1~100, 기본 100) `cursor`. 응답 `meta.nextCursor`를 다음 요청의 `cursor`로 보내고, `meta.hasMore`가 `false`면 마지막 페이지입니다. - 낙찰 여부는 공고 상태가 아니라 `GET /v2/bid-results`의 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없습니다.
1800
1800
  * @summary 공고 목록 조회
1801
1801
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
1802
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달한다. 미지정 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
1803
- * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV 로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
1802
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 보냅니다. 생략하면페이지이고, &#x60;nextCursor&#x60;가 &#x60;null&#x60;이면 마지막 페이지입니다.
1803
+ * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
1804
1804
  * @param {Array<BidPublicStatus>} [status] 공고 상태 필터(공개값) CSV. 지정 시 그중 하나라도 일치하는 공고만 조회합니다.
1805
1805
  * @param {Array<ListBidsIncludeEnum>} [include] 행별 확장 부착 CSV. &#x60;results&#x60;&#x3D;응찰 참여자, &#x60;products&#x60;&#x3D;공고 등록 품목, &#x60;contacts&#x60;&#x3D;발주 담당자 성명·연락처·이메일. 미지정이면 부착하지 않는다(응답이 가볍고 조회 비용도 들지 않는다).
1806
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1806
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1807
1807
  * @param {*} [options] Override http request option.
1808
1808
  * @throws {RequiredError}
1809
1809
  */
@@ -1817,7 +1817,7 @@ const PartnerApiApiFp = function (configuration) {
1817
1817
  });
1818
1818
  },
1819
1819
  /**
1820
- * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market 이 데이터를 채워 PDF 로 만들어 주는 서류입니다. 생성 API 의 `paperCodes` 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
1820
+ * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market이 데이터를 채워 PDF로 만들어 주는 서류입니다. 생성 API의 `paperCodes`에 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
1821
1821
  * @summary 거래에 필요한 계약서류 목록 조회
1822
1822
  * @param {string} buyerId 발주기관 회원 ID(c-market memberId).
1823
1823
  * @param {ListExternalContractDocumentsBidTypeEnum} bidType 거래유형.
@@ -1834,13 +1834,13 @@ const PartnerApiApiFp = function (configuration) {
1834
1834
  });
1835
1835
  },
1836
1836
  /**
1837
- * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 걸러 다시 처리하면 됩니다. - \"이벤트가 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 같고 `attempt` 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 다음 요청의 `cursor` 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
1837
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문, 수신측 응답 상태, 다음 재시도 시각이 함께 실립니다. 스코프 `webhooks:read`. - 수신측 장애로 놓친 이벤트는 `status=EXHAUSTED`로 걸러 다시 처리합니다. 웹훅의 폴링 대체 경로입니다. - 재시도마다 한 행이며 `eventId`가 같고 `attempt`만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단합니다. - 페이지네이션: 응답 `nextCursor`를 다음 요청의 `cursor`로 보냅니다. `null`이면 마지막 페이지입니다.
1838
1838
  * @summary 웹훅 전송 이력 조회
1839
1839
  * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
1840
1840
  * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
1841
1841
  * @param {number} [limit] 페이지 크기(1~200, 기본 50).
1842
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달합니다. 미지정 시 첫 페이지.
1843
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1842
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 전달합니다. 미지정 시 첫 페이지.
1843
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1844
1844
  * @param {*} [options] Override http request option.
1845
1845
  * @throws {RequiredError}
1846
1846
  */
@@ -1854,9 +1854,9 @@ const PartnerApiApiFp = function (configuration) {
1854
1854
  });
1855
1855
  },
1856
1856
  /**
1857
- * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. **호출 시점:** 연동 상태를 점검할 때, 또는 발송이 멈춘 이유(`status`·`consecutiveFailures`)를 확인할 때. 서명 시크릿은 여기에 실리지 않습니다. **필수 스코프:** `webhooks:read` ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 을 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 — JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 을 계산해 **base64** 로 인코딩하고, `webhook-signature` 의 `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 는 공백으로 구분된 **여러 서명**을 실을 수 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** — 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 과 같은 값)도 실립니다 — 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 — 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 로 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 로 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 은 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
1857
+ * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. 스코프 `webhooks:read`. 발송이 멈춘 이유는 `status`와 `consecutiveFailures`로 확인합니다. 서명 시크릿은 실리지 않습니다. 수신측 구현 방법은 `POST /v2/webhook-endpoints` 설명에 있습니다.
1858
1858
  * @summary 웹훅 구독 목록 조회
1859
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1859
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
1860
1860
  * @param {*} [options] Override http request option.
1861
1861
  * @throws {RequiredError}
1862
1862
  */
@@ -1870,10 +1870,10 @@ const PartnerApiApiFp = function (configuration) {
1870
1870
  });
1871
1871
  },
1872
1872
  /**
1873
- * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(FAILED)로 전환됩니다. - 유찰사유 코드와 상세가 기록됩니다. **유찰사유 값 목록(failureReasonCode 공개값):** | | 의미 | |------|------| | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `OTHER` | 기타 (`failureReasonDetail` 필수) | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1873
+ * 공고를 유찰 처리합니다. 입찰 마감 상태에서 호출합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. 공고 상태가 유찰(`FAILED`)로 바뀌고 유찰사유가 기록됩니다. 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). | `failureReasonCode` | 의미 | | --- | --- | | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | | `OTHER` | 기타(`failureReasonDetail` 필수) |
1874
1874
  * @summary 유찰 처리
1875
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1876
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1875
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1876
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1877
1877
  * @param {MarkBidFailedRequestDto} markBidFailedRequestDto
1878
1878
  * @param {*} [options] Override http request option.
1879
1879
  * @throws {RequiredError}
@@ -1888,10 +1888,10 @@ const PartnerApiApiFp = function (configuration) {
1888
1888
  });
1889
1889
  },
1890
1890
  /**
1891
- * 낙찰 결과를 등록합니다. 요청의 응답은 처리 상태 `AWARDED` 반환합니다. **호출 시점:** 입찰 마감 후 낙찰자가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 낙찰자(공급사)의 응찰 건이 낙찰 처리됩니다. - 이후 **공고의 조회 상태(status)는 계약진행(CONTRACT_IN_PROGRESS)** 으로 진행합니다. `AWARDED` 라는 공고 status 존재하지 않으므로, 낙찰 여부는 `GET /v2/bids/{bidRef}/results` 의 `participants[].isWinner` 또는 `GET /v2/bids/{bidRef}` 의 status(=계약진행)로 관측하세요(`status === \'AWARDED\'` 폴링 금지). - 협상 방식(NEGOTIATION/NEGOTIATION_AUTO) 공고는 이 엔드포인트 전에 `POST /v2/bids/{bidRef}/negotiation-scores`(협상 점수평가)로 평가를 완료해야 합니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 24시간 캐시 응답 반환.
1891
+ * 낙찰 결과를 등록합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감(입찰완료) 상태에서 호출합니다. - 낙찰 공고 상태는 계약진행(`CONTRACT_IN_PROGRESS`)입니다. `AWARDED` 공고 상태는 없으므로 낙찰 여부는 `participants[].isWinner`로 판단합니다. - 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고는 `POST /v2/bids/{bidRef}/negotiation-scores`로 평가를 마쳐야 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 같은 키와 같은 body 재전송하면 24시간 동안 캐시된 응답을 돌려줍니다.
1892
1892
  * @summary 낙찰 결과 전송
1893
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1894
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1893
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1894
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1895
1895
  * @param {RegisterAwardRequestDto} registerAwardRequestDto
1896
1896
  * @param {*} [options] Override http request option.
1897
1897
  * @throws {RequiredError}
@@ -1906,9 +1906,9 @@ const PartnerApiApiFp = function (configuration) {
1906
1906
  });
1907
1907
  },
1908
1908
  /**
1909
- * 입찰 정보 등록. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **첨부는 2단계입니다.** 파일을 요청 본문에 직접 싣지 마세요 먼저 `POST /v2/files`(base64 또는 url)로 올려 `fileKey` 받고, 32자 키를 요청의 `attachments` 배열에 넣습니다.
1909
+ * 공고를 등록합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. 첨부는 방법 하나입니다. - `attachments` 원소에 `{ fileName, url }` 또는 `{ fileName, base64 }`를 그대로 넣습니다. - 여러 공고에서 재사용할 파일은 `POST /v2/files`로 먼저 올려 받은 `fileKey`를 넣습니다.
1910
1910
  * @summary 공고 등록
1911
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1911
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1912
1912
  * @param {CreateBidRequestDto} createBidRequestDto
1913
1913
  * @param {*} [options] Override http request option.
1914
1914
  * @throws {RequiredError}
@@ -1925,7 +1925,7 @@ const PartnerApiApiFp = function (configuration) {
1925
1925
  /**
1926
1926
  * 외부에서 맺어진 계약 1건을 씨마켓의 **세금계산서 발행 대상**으로 등록합니다. **등록 후 동선:** 발주기관이 씨마켓 [나의 계약 관리] 에서 계산서 발급을 요청하고, 공급기업이 같은 화면에서 발행합니다. 계산서의 **공급자는 공급기업, 공급받는자는 발주기관**입니다. **대금 흐름:** 씨마켓은 이 거래의 대금을 받지 않습니다 — 발행 경로만 제공합니다. **금액:** `supplyPrice` 는 **부가세를 뺀 과세 공급가액**입니다(결제창 API 가 부가세 포함가를 받는 것과 다릅니다). 과세·면세 공급가액이 모두 0 이면 400 입니다. **사전 조건:** 두 회원 ID 가 씨마켓에 실재해야 합니다. 회원 ID 가 곧 소유권이라, 없는 회원으로 등록하면 아무도 열 수 없는 계산서 대상이 됩니다. **필수 스코프:** `contracts:write`. 바인딩된 발주처 외의 발주기관을 대신하려면 대행 범위에 그 회원이 있어야 합니다. **멱등성:** `externalContractId` 가 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 대상을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
1927
1927
  * @summary 계약 발행대상 등록
1928
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1928
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1929
1929
  * @param {RegisterSemoContractRequestDto} registerSemoContractRequestDto
1930
1930
  * @param {*} [options] Override http request option.
1931
1931
  * @throws {RequiredError}
@@ -1940,10 +1940,10 @@ const PartnerApiApiFp = function (configuration) {
1940
1940
  });
1941
1941
  },
1942
1942
  /**
1943
- * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write`. **청구만 접수합니다.** 호출이 계산서를 발행하지는 않습니다 접수된 청구는 정산 파이프라인이 처리하며, 진행 여부는 `GET /v2/bids/{bidRef}` `taxInvoiceRequested` 관측합니다. **나눠 담을 금액을 보냅니다.** `supplyAmount`(공급가액)와 `vat`(부가세)는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 같은 공고에 청구를 한 번 더 보냅니다 — 그때는 **새 `Idempotency-Key`** 쓰세요. 같은 키로 다시 보내면 앞선 청구의 응답이 그대로 재생됩니다. **발급 희망일**(`issueDate`)은 선택이며 미래 일자는 400 입니다. 미지정 시 서버 기본값을 씁니다.
1943
+ * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write` · `Idempotency-Key` 헤더 필수. - 청구만 접수합니다. 발행은 정산 파이프라인이 처리하며 진행 여부는 `GET /v2/bids/{bidRef}`의 `taxInvoiceRequested`로 확인합니다. - `supplyAmount`와 `vat`는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 **새 `Idempotency-Key`**로 청구합니다. 같은 키는 앞선 청구의 응답을 그대로 돌려줍니다. - `issueDate`는 선택이며 미래 일자는 400입니다.
1944
1944
  * @summary 계산서 분할 발급 청구
1945
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1946
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1945
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1946
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1947
1947
  * @param {RequestInvoiceSplitRequestDto} requestInvoiceSplitRequestDto
1948
1948
  * @param {*} [options] Override http request option.
1949
1949
  * @throws {RequiredError}
@@ -1960,8 +1960,8 @@ const PartnerApiApiFp = function (configuration) {
1960
1960
  /**
1961
1961
  * 확정된 낙찰을 되돌려 공고를 낙찰대기(PENDING_AWARD) 상태로 보냅니다. 스코프 `awards:write` + `Idempotency-Key` 헤더 필수. **호출 시점:** 낙찰자가 계약을 포기했거나 낙찰 처리 자체가 잘못됐을 때. 되돌린 뒤 같은 공고에 다시 낙찰을 등록할 수 있습니다. **되돌릴 수 없는 경우 → 409:** - 수수료 결제가 이미 완료된 공고 - 세금계산서가 이미 발행된 공고 - 수입권공매 계열 낙찰방법(다수 낙찰자 구조라 되돌리기 단위가 다릅니다) **사유는 필수입니다** — 감사 대상 행위이며 공고 이력에 남습니다. **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
1962
1962
  * @summary 낙찰 되돌리기
1963
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
1964
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1963
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
1964
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1965
1965
  * @param {RevertAwardRequestDto} revertAwardRequestDto
1966
1966
  * @param {*} [options] Override http request option.
1967
1967
  * @throws {RequiredError}
@@ -1976,10 +1976,10 @@ const PartnerApiApiFp = function (configuration) {
1976
1976
  });
1977
1977
  },
1978
1978
  /**
1979
- * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
1979
+ * 서명 시크릿을 새로 발급합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 시크릿은 이 응답에서 한 번만 나가고 `secretVersion`이 1 올라갑니다. - **옛 시크릿은 즉시 무효입니다.** 유예가 없으므로 순서를 지키세요 — ① 수신측이 옛 값과 새 값을 모두 받아들이도록 배포 → ② 이 호출 → ③ 새 반영 → ④ 옛 값 제거. - 같은 `Idempotency-Key`로 다시 부르면 새로 발급하지 않고 처음 발급한 값을 돌려줍니다(24시간).
1980
1980
  * @summary 웹훅 서명 시크릿 재발급
1981
1981
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1982
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1982
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1983
1983
  * @param {*} [options] Override http request option.
1984
1984
  * @throws {RequiredError}
1985
1985
  */
@@ -1993,10 +1993,10 @@ const PartnerApiApiFp = function (configuration) {
1993
1993
  });
1994
1994
  },
1995
1995
  /**
1996
- * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` `delivered: false` 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
1996
+ * 등록된 주소로 `ping` 이벤트를 1회 보내고 결과를 돌려줍니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 수신측이 받지 못해도 응답은 200이고 `delivered: false`입니다. 원인은 `responseStatus`와 `error`로 좁힙니다. - 실제 이벤트와 같은 서명 헤더가 실리므로 검증 코드를 그대로 시험할 수 있습니다. - 다시 보내려면 `Idempotency-Key`를 쓰세요. 같은 키는 24시간 동안 직전 결과를 돌려줍니다.
1997
1997
  * @summary 웹훅 연결 확인 발송
1998
1998
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1999
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1999
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2000
2000
  * @param {*} [options] Override http request option.
2001
2001
  * @throws {RequiredError}
2002
2002
  */
@@ -2010,10 +2010,10 @@ const PartnerApiApiFp = function (configuration) {
2010
2010
  });
2011
2011
  },
2012
2012
  /**
2013
- * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
2013
+ * 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고의 응찰자별 점수를 입력합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전에 호출합니다. 협상 방식 공고는 이 평가를 마쳐야 낙찰에 진입합니다. - `complete=true`면 평가완료로 처리되어 낙찰을 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다).
2014
2014
  * @summary 협상 점수평가
2015
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2016
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2015
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2016
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2017
2017
  * @param {SubmitNegotiationScoresRequestDto} submitNegotiationScoresRequestDto
2018
2018
  * @param {*} [options] Override http request option.
2019
2019
  * @throws {RequiredError}
@@ -2028,11 +2028,11 @@ const PartnerApiApiFp = function (configuration) {
2028
2028
  });
2029
2029
  },
2030
2030
  /**
2031
- * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. 진행중/초안 상태의 공고만 수정할 수 있습니다. **부수효과:** - 변경 내용이 반영되고 수정이력이 기록됩니다. - `hideEditHistory=true` 면 변경이력을 비공개 처리하고 노출 카운터 증가를 생략합니다. **수정 제약:** - 낙찰방법(awardMethod)은 수정 불가(잠금). - 참여자가 있으면 입찰방식/면허/예산/품목 일부가 잠깁니다. - 마감/취소된 공고는 수정할 수 없습니다. 한 섹션을 수정하려면 해당 섹션의 필수 필드를 함께 보내야 합니다(부분 섹션은 거부됨).
2031
+ * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 진행중·초안 상태만 수정할 수 있습니다. 마감·취소된 공고는 거부됩니다. - 낙찰방법(`awardMethod`)은 수정할 없고, 참여자가 있으면 입찰방식·면허·예산·품목 일부가 잠깁니다. - 한 섹션을 수정하려면 섹션의 필수 필드를 함께 보냅니다. - `hideEditHistory=true`면 변경이력을 비공개로 남기고 노출 카운터를 올리지 않습니다.
2032
2032
  * @summary 공고 수정
2033
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2034
- * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412 로 거절되며 아무것도 수정되지 않습니다.
2035
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2033
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2034
+ * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412로 거절되며 아무것도 수정되지 않습니다.
2035
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2036
2036
  * @param {UpdateBidRequestDto} updateBidRequestDto
2037
2037
  * @param {*} [options] Override http request option.
2038
2038
  * @throws {RequiredError}
@@ -2047,11 +2047,11 @@ const PartnerApiApiFp = function (configuration) {
2047
2047
  });
2048
2048
  },
2049
2049
  /**
2050
- * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 헤더가 없으면 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` 헤더를 빼먹었습니다. 조회 `ETag` 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2050
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - `eventTypes`는 치환입니다. 하나를 더하려면 기존 목록을 포함한 전체를 보냅니다. - `If-Match`가 필수입니다. `GET`으로 받은 `ETag`를 그대로 실으세요. 누락은 428, 사이 구독이 바뀌었으면 412이며 아무것도 수정되지 않습니다. - 연속 실패로 자동 중지된 구독은 `{\"status\":\"ACTIVE\"}`로 되살립니다. - 시크릿은 이 경로로 바뀌지 않습니다. 재발급은 `rotate-secret`입니다.
2051
2051
  * @summary 웹훅 구독 수정
2052
2052
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2053
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2054
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2053
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
2054
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2055
2055
  * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
2056
2056
  * @param {*} [options] Override http request option.
2057
2057
  * @throws {RequiredError}
@@ -2066,9 +2066,9 @@ const PartnerApiApiFp = function (configuration) {
2066
2066
  });
2067
2067
  },
2068
2068
  /**
2069
- * **첨부 업로드의 기본 경로입니다. 23MB 이하면 호출 하나로 끝납니다.** 파일 본문을 `base64` 또는 `url` 중 정확히 하나로 제출하면 `fileKey` 를 돌려줍니다. 이 값을 공고 등록·수정의 첨부 필드에 실으세요. **23MB 를 넘으면 경로를 바꿔야 합니다.** 상한이 셋으로 갈립니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | **23MB** (본문이 c-market 을 통과하며 base64 팽창 4/3 이 얹힘) | 1 | | 이 호출 + `url` | **30MB** (c-market 이 대신 내려받아 팽창은 없지만 서버 경유 천장은 그대로) | 1 | | `POST /v2/files/upload-url` 로 시작하는 2단계 | **100MB** (바이트가 c-market 을 지나지 않음) | 2 + 스토리지 PUT | c-market 내려받을 있는 https 주소에 파일을 올려 둘 수 있다면 `url` 이 30MB 까지를 1콜로 덮습니다. 그 이상이거나 주소를 열 수 없으면 2단계 경로를 쓰세요. **공고 등록에 파일을 함께 실을 수도 있습니다.** `POST /v2/bids` `attachments` 원소에 `{ fileName, url }`·`{ fileName, base64 }` 그대로 넣으면 호출 없이 번에 끝납니다. 여러 공고에 같은 파일을 재사용하거나 큰 파일을 다룰 때만 `fileKey` 를 먼저 만드세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2069
+ * 공고 첨부파일을 올리고 `fileKey`를 받습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. `base64`와 `url` 중 하나만 보냅니다. 받은 `fileKey`는 공고 등록·수정의 `attachments`에 넣습니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | 23MB | 1 | | 이 호출 + `url` | 30MB | 1 | | `POST /v2/files/upload-url` 2단계 | 100MB | 2 + 스토리지 PUT | 공고에만 쓰는 파일이면 `POST /v2/bids`의 `attachments`에 `url`·`base64`를 직접 넣어호출을 생략할 있습니다.
2070
2070
  * @summary 공고 첨부파일 업로드 (기본)
2071
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2071
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2072
2072
  * @param {UploadFileRequestDto} uploadFileRequestDto
2073
2073
  * @param {*} [options] Override http request option.
2074
2074
  * @throws {RequiredError}
@@ -2092,10 +2092,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2092
2092
  const localVarFp = (0, exports.PartnerApiApiFp)(configuration);
2093
2093
  return {
2094
2094
  /**
2095
- * 진행중인 공고를 취소합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **되돌릴없습니다.** 취소 사유는 필수이며 공고 이력에 남습니다. **전제조건:** 진행중(ONGOING) 상태여야 합니다. **거부:** 진행중이 아니거나 이미 취소된 공고 409. 발주처 공고 403. **마감과의 차이:** 취소는 공고를 무효로 되돌리는 것이고, 유찰(`POST /v2/bids/{bidRef}/fail`)은 응찰을 받았으나 낙찰자를 정하지 못한 종료입니다.
2095
+ * 진행중(`ONGOING`) 공고를 취소합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 되돌릴 없습니다. 취소 사유는 필수이고 공고 이력에 남습니다. - 진행중이 아니거나 이미 취소된 공고는 409, 다른 발주기관의 공고는 403입니다. - 응찰은 받았으나 낙찰자를 정하지 못한 종료는 취소가 아니라 유찰(`POST /v2/bids/{bidRef}/fail`)입니다.
2096
2096
  * @summary 공고 취소
2097
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2098
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2097
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2098
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2099
2099
  * @param {CancelBidRequestDto} cancelBidRequestDto
2100
2100
  * @param {*} [options] Override http request option.
2101
2101
  * @throws {RequiredError}
@@ -2104,10 +2104,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2104
2104
  return localVarFp.cancelBid(bidRef, idempotencyKey, cancelBidRequestDto, options).then((request) => request(axios, basePath));
2105
2105
  },
2106
2106
  /**
2107
- * 낙찰 공고의 검수(납품 검수)가 완료되었음을 기록합니다. **호출 시점:** 낙찰자(공급사)가 납품을 완료하고 구매자가 검수를 확인한 시점입니다. 공고 상태가 낙찰(AWARDED) 상태여야 합니다. **부수효과:** - 검수완료 상태가 기록됩니다. - 현금 결제 공고는 세금계산서 발행요청이 등록되고, 낙찰자(공급사)에게 발행요청 알림·문자가 발송됩니다. 카드 결제 공고는 발행요청 축이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 응답 코드는 200이며, 처리 결과가 본문에 담겨 반환됩니다. **부분계약(협의 감액):** 낙찰 후 협의로 계약금액이 줄었으면 `supplyAmount`+`vat` 함께 보내세요. 그 금액으로 계산서 발행이 요청됩니다. 생략하면 낙찰금액에서 파생합니다. 현금 결제 공고·낙찰자 1인·감액(증액 불가)일 때만 허용되며, 어긋나면 409 입니다. **문서에 찍히는 값:** 거래명세서·검수보고서의 구매사 사업자정보·담당자·작성일자는 등록된 발주처 정보에서 채워집니다. 요청으로 덮어쓸 수 없습니다. **낙찰자:** 공고의 낙찰 상태에서 결정되며 요청으로 지정하지 않습니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2107
+ * 납품 검수 완료를 기록합니다. 낙찰 처리된 공고에서 호출합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 현금 결제 공고는 세금계산서 발행요청이 등록되고 낙찰자에게 알림·문자가 나갑니다. 카드 결제 공고는 발행요청이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 협의로 계약금액이 줄었으면 `supplyAmount`와 `vat`를 함께 보냅니다. 현금 결제·낙찰자 1인·감액일 때만 허용하며 어긋나면 409입니다. 생략하면 낙찰금액에서 파생합니다. - 문서에 찍히는 구매사 사업자정보·담당자·작성일자와 낙찰자는 등록된 값에서 채워지며 요청으로 바꿀 수 없습니다.
2108
2108
  * @summary 검수완료 전송
2109
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2110
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2109
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2110
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2111
2111
  * @param {CompleteAcceptanceRequestDto} completeAcceptanceRequestDto
2112
2112
  * @param {*} [options] Override http request option.
2113
2113
  * @throws {RequiredError}
@@ -2116,10 +2116,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2116
2116
  return localVarFp.completeAcceptance(bidRef, idempotencyKey, completeAcceptanceRequestDto, options).then((request) => request(axios, basePath));
2117
2117
  },
2118
2118
  /**
2119
- * `uploadUrl` 로의 `PUT` 이 끝난 뒤 호출합니다. 올라온 파일을 실측해 등록하고, 시점부터 `fileKey` 공고 첨부로 쓸 수 있습니다. **확정 `fileKey` 첨부로 없습니다** 공고 등록이 400 으로 거절됩니다. **신고한 크기가 아니라 실제 파일을 봅니다.** 발급 요청의 `fileSize` 와 다르면 실제 크기가 기록되고, 정책 상한을 넘으면 여기서 거절됩니다. **같은 `fileKey` 여러 번 호출해도 안전합니다**(멱등). **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2119
+ * `uploadUrl`로 올린 파일을 확정합니다. 시점부터 `fileKey`를 공고 첨부로 쓸 수 있습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. - 확정 `fileKey`를 첨부로 쓰면 공고 등록이 400입니다. - 신고한 `fileSize`가 아니라 실제 파일을 측정해 기록하며, 정책 상한을 넘으면 여기서 거절됩니다. - 같은 `fileKey`로 여러 번 호출해도 안전합니다.
2120
2120
  * @summary 대용량 업로드 2/2 — 업로드 확정
2121
2121
  * @param {string} fileKey 발급 응답의 fileKey(영문 대소문자·숫자 32자).
2122
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2122
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2123
2123
  * @param {CompleteUploadRequestDto} completeUploadRequestDto
2124
2124
  * @param {*} [options] Override http request option.
2125
2125
  * @throws {RequiredError}
@@ -2128,10 +2128,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2128
2128
  return localVarFp.completeFileUpload(fileKey, idempotencyKey, completeUploadRequestDto, options).then((request) => request(axios, basePath));
2129
2129
  },
2130
2130
  /**
2131
- * 공급사로부터 계산서를 수령한 뒤, 계약을 완료처리 상태로 강제 전환합니다. **호출 시점:** 낙찰·계약 완료 후 공급사 계산서를 오프라인으로 수령했을 때. **부수효과:** - 결제완료·계산서 발급 상태가 기록되고 발급일자가 현재 시각으로 설정됩니다. **소유권:** 공고는 요청 파트너 키가 소유한 발주처 명의여야 합니다(타 발주처 공고 → 403). **이미 완료:** 이미 완료처리된 공고 재호출 → 409. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2131
+ * 공급사에게 계산서를 수령한 계약을 완료처리합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 결제완료·계산서 발급 상태가 기록되고 발급일자는 현재 시각이 됩니다. - 이미 완료된 공고는 409, 다른 발주기관의 공고는 403입니다.
2132
2132
  * @summary 정산 마감
2133
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2134
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2133
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2134
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2135
2135
  * @param {*} [options] Override http request option.
2136
2136
  * @throws {RequiredError}
2137
2137
  */
@@ -2139,9 +2139,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2139
2139
  return localVarFp.completeInvoice(bidRef, idempotencyKey, options).then((request) => request(axios, basePath));
2140
2140
  },
2141
2141
  /**
2142
- * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable` 미리 확인하세요. 미가입 업체로 발행하면 400 입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2142
+ * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable`로 미리 확인하세요. 미가입 업체로 발행하면 400입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2143
2143
  * @summary 결제창 발행
2144
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2144
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2145
2145
  * @param {CreateCardPaymentDto} createCardPaymentDto
2146
2146
  * @param {*} [options] Override http request option.
2147
2147
  * @throws {RequiredError}
@@ -2150,9 +2150,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2150
2150
  return localVarFp.createCardPayment(idempotencyKey, createCardPaymentDto, options).then((request) => request(axios, basePath));
2151
2151
  },
2152
2152
  /**
2153
- * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2153
+ * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2154
2154
  * @summary 계약서류 생성
2155
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2155
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2156
2156
  * @param {CreateExternalContractDocumentsRequestDto} createExternalContractDocumentsRequestDto
2157
2157
  * @param {*} [options] Override http request option.
2158
2158
  * @throws {RequiredError}
@@ -2161,9 +2161,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2161
2161
  return localVarFp.createExternalContractDocuments(idempotencyKey, createExternalContractDocumentsRequestDto, options).then((request) => request(axios, basePath));
2162
2162
  },
2163
2163
  /**
2164
- * 파일 본문을 스토리지로 **직접** 올리기 위한 1회용 서명 URL 발급합니다. 3단계로 씁니다. 1. 이 호출로 `fileKey` `uploadUrl` 받습니다. 2. `uploadUrl` 파일 본문을 `PUT` 합니다 응답의 `contentType` `Content-Type` 헤더에 그대로 실으세요. 요청은 c-market 거치지 않습니다. 3. `POST /v2/files/{fileKey}/complete` 확정합니다. **2단계는 이 명세에 오퍼레이션으로 나오지 않습니다** — 요청이 c-market 이 아니라 스토리지로 가기 때문입니다. 형태는 이게 전부입니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` ```ts import { readFile } from \'node:fs/promises\'; // 본문은 **파일 바이트 그대로**입니다 — JSON 도 multipart 도 아닙니다. await fetch(uploadUrl, { method: \'PUT\', headers: { \'Content-Type\': contentType }, body: await readFile(\'시방서.pdf\'), }); ``` **`Authorization` 헤더를 붙이지 마세요.** 자격증명이 `uploadUrl` 안에 서명으로 들어 있어 별도 인증이 필요 없습니다. 같은 이유로 주소는 **주소 자체가 자격증명**이므로 로그에 남기지 마세요. **2단계의 실패 응답은 problem+json 아닙니다.** 스토리지가 직접 답하므로 본문 형식이 다릅니다 — c-market 에러 파서에 넣지 마세요. 만료(`400`)·중복 업로드(`409`)라면 1단계부터 다시 하세요. **`POST /v2/files` 와 언제 갈리나:** 기본은 `POST /v2/files` 한 번입니다 — `base64` 로 23MB, `url` 로 30MB 까지 그 한 번으로 끝납니다. 그 위(**100MB** 까지)만 이 2단계 경로를 쓰세요. 바이트가 c-market 을 지나지 않아 서버 경유 천장을 받지 않습니다. **`uploadUrl` 1회용입니다.** 덮어쓰기가 막혀 있고 `expiresIn` 만료됩니다 저장해 두고 재사용하지 마시고, 만료됐다면 호출부터 다시 하세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2164
+ * 파일을 스토리지로 직접 올리기 위한 1회용 서명 URL을 발급합니다(100MB까지). 스코프 `files:write` · `Idempotency-Key` 헤더 필수. 1. 이 호출로 `fileKey`와 `uploadUrl`을 받습니다. 2. `uploadUrl`에 파일 바이트를 그대로 `PUT` 합니다. 응답의 `contentType`을 `Content-Type` 헤더에 싣고, `Authorization` 헤더는 붙이지 않습니다(주소 자체가 자격증명입니다). 3. `POST /v2/files/{fileKey}/complete`로 확정합니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` - 2단계는 요청이 스토리지로 가므로명세에 오퍼레이션이 없고, 실패 본문도 problem+json이 아닙니다. 만료(400)·중복 업로드(409) 1단계부터 다시 합니다. - `uploadUrl`은 1회용이며 `expiresIn`초만료됩니다. 주소가 자격증명이므로 로그에 남기지 않습니다. - 30MB 이하는 `POST /v2/files` 번으로 끝납니다.
2165
2165
  * @summary 대용량 업로드 1/2 — 업로드 주소 발급
2166
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2166
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2167
2167
  * @param {CreateUploadUrlRequestDto} createUploadUrlRequestDto
2168
2168
  * @param {*} [options] Override http request option.
2169
2169
  * @throws {RequiredError}
@@ -2172,9 +2172,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2172
2172
  return localVarFp.createFileUploadUrl(idempotencyKey, createUploadUrlRequestDto, options).then((request) => request(axios, basePath));
2173
2173
  },
2174
2174
  /**
2175
- * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 1회. 수신 주소가 바뀌면 새로 만들지 말고 `PATCH` 고치세요 — 그래야 시크릿과 전송 이력이 유지됩니다. **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 응답의 `secret` 을 즉시 안전한 곳에 보관하세요. 잃어버렸다면 복구가 아니라 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret` 으로 **재발급**해야 합니다. **거절되는 경우와 고치는 법:** - `400` `url` HTTPS 아니거나 형식이 잘못됨, `eventTypes` 비었거나 목록 값 (`ping` 은 구독 불가). 값을 고쳐 재시도하세요. - `400` `Idempotency-Key` 헤더 누락/형식 오류. UUID v4 를 실어 보내세요. - `403` 토큰에 `webhooks:write` 스코프가 없음. 키 발급 설정을 넓혀야 합니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 — 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 계산해 **base64** 인코딩하고, `webhook-signature` `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 공백으로 구분된 **여러 서명**을 실을 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 같은 값)도 실립니다 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2175
+ * 수신 주소와 구독할 이벤트를 등록합니다. 연동 초기 1 호출합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 잃어버렸다면 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret`으로 재발급합니다. - 수신 주소가 바뀌면 새로 만들지 말고 `PATCH`로 고치세요. 시크릿과 전송 이력이 유지됩니다. - `url`은 HTTPS만 허용하고 `eventTypes`는 아래 목록 안의 값이어야 합니다. 어기면 400입니다. ### 서명 검증 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약입니다. 직접 짜지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿(`whsec_…`)을 그대로 넘기세요. ```ts import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); // 실패하면 예외 ``` 라이브러리를 쓸 수 없다면 헤더 셋으로 직접 검증합니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 base64 디코드한 바이트가 HMAC 키입니다. 2. `{webhook-id}.{webhook-timestamp}.{본문}`을 연결합니다. 본문은 **파싱 전 원문 바이트**여야 합니다. JSON을 다시 직렬화하면 순서·공백이 달라져 서명이 어긋납니다. 3. HMAC-SHA256을 base64로 인코딩해 `webhook-signature`의 `v1,` 뒤 값과 상수 시간 함수로 비교합니다. 4. `webhook-timestamp`가 5 이상 지났으면 거절합니다. `webhook-signature`에는 서명이 여러 실릴있으므로(키 회전용) 하나라도 맞으면 통과로 처리하세요. ### 중복 제거 `webhook-id`가 이벤트 식별자입니다. 재시도에도 같은 값이 오므로 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상이며 중복 제거는 수신측 책임입니다. `webhook-event-type` 헤더에 본문 `type`과 같은 값이 실려, 본문을 파싱하기 전에 거를 수 있습니다. ### 재시도와 자동 중지 2xx를 돌려주면 성공입니다. 그 외에는 최대 7회 재시도하며 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간입니다. 처리가 길면 먼저 2xx를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 `DISABLED`로 내려갑니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}`에 `{\"status\":\"ACTIVE\"}`로 되살리세요. ### 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping`은 연결 확인 전용이라 구독할 수 없습니다. 놓친 이벤트는 `GET /v2/webhook-deliveries`로 조회해 메웁니다.
2176
2176
  * @summary 웹훅 구독 등록
2177
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2177
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2178
2178
  * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
2179
2179
  * @param {*} [options] Override http request option.
2180
2180
  * @throws {RequiredError}
@@ -2183,11 +2183,11 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2183
2183
  return localVarFp.createWebhookEndpoint(idempotencyKey, createWebhookEndpointRequestDto, options).then((request) => request(axios, basePath));
2184
2184
  },
2185
2185
  /**
2186
- * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH {\"status\":\"DISABLED\"}` 쓰세요 시크릿과 이벤트 구성이 남아 그대로 되살릴 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2186
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 되돌릴없습니다. 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. 잠시만 멈추려면 `PATCH`로 `{\"status\":\"DISABLED\"}`를 보내세요. - `If-Match`가 필수입니다. 누락은 428, 그 사이 구독이 바뀌었으면 412입니다.
2187
2187
  * @summary 웹훅 구독 삭제
2188
2188
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2189
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2190
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2189
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
2190
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2191
2191
  * @param {*} [options] Override http request option.
2192
2192
  * @throws {RequiredError}
2193
2193
  */
@@ -2195,9 +2195,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2195
2195
  return localVarFp.deleteWebhookEndpoint(endpointId, ifMatch, idempotencyKey, options).then((request) => request(axios, basePath));
2196
2196
  },
2197
2197
  /**
2198
- * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`URL 을 가리킨다. 요청 시점에 서명하므로 URL 을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}` 파일 메타와 `downloadUrl` v2 응답 규약으로 돌려줍니다. 이 안정 URL 은 파트너 응답의 `fileUrl`/`fullUrl` 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
2198
+ * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`이 이 URL을 가리킨다. 요청 시점에 서명하므로 URL을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}`가 파일 메타와 `downloadUrl`을 v2 응답 규약으로 돌려줍니다. 이 안정 URL은 파트너 응답의 `fileUrl`/`fullUrl`이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
2199
2199
  * @summary 파일 다운로드
2200
- * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다.
2200
+ * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다.
2201
2201
  * @param {*} [options] Override http request option.
2202
2202
  * @throws {RequiredError}
2203
2203
  */
@@ -2205,10 +2205,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2205
2205
  return localVarFp.downloadFile(fileKey, options).then((request) => request(axios, basePath));
2206
2206
  },
2207
2207
  /**
2208
- * 공고의 모든 정보를 번에 조회합니다 — 기본 정보·납품/대금 조건·담당자·품목, 응찰 참여자(투찰가·순위·낙찰 여부), 계약서류, 검수 진행 상태, 라이프사이클 하위 상태. 스코프 `bids:read`. ERP 는 이 엔드포인트를 폴링해 async 처리(정산 마감 등)의 성사를 관측합니다. **낙찰 여부:** 응답의 `status` 아니라 `participants[].isWinner` 관측합니다. AWARDED 라는 공고 상태는 존재하지 않으며(낙찰 직후 공고는 CONTRACT_IN_PROGRESS 로 전이) `status === \'AWARDED\'` 기다리면 영원히 도달하지 않습니다. **여러 건을 한 번에:** 공고마다 이 조회를 반복하지 말고 `GET /v2/bid-results` 배치 조회를 쓰세요. **계약서류는 이 응답에 실립니다.** `contractDocuments[]` 서류별 `paperCode`·`paperName`· `fileKey`·`downloadUrl`·`uploadedAt`·`winnerSequence` 를 담습니다 — 계약서류만 따로 받는 엔드포인트는 두지 않습니다. `generationState` **관측 전용**이며 `DEAD_LETTER` 보이면 자동 재시도가 소진된 상태라 API 되살릴 수 없습니다(운영에 문의하세요). **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
2208
+ * 공고 건의 전체 정보를 조회합니다 — 기본 정보, 납품·대금 조건, 담당자, 품목, 응찰 참여자, 계약서류, 검수 상태. 스코프 `bids:read`. - 낙찰 여부는 `status`가 아니라 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없어(낙찰 직후 `CONTRACT_IN_PROGRESS`) `status === \'AWARDED\'` 폴링은 끝나지 않습니다. - 계약서류는 `contractDocuments[]`에 실립니다. 따로 받는 엔드포인트는 없습니다. - 여러 건은 `GET /v2/bid-results`로 번에 받습니다. - 다른 발주기관의 공고는 403입니다.
2209
2209
  * @summary 공고 상세 조회
2210
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2211
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2210
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2211
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2212
2212
  * @param {*} [options] Override http request option.
2213
2213
  * @throws {RequiredError}
2214
2214
  */
@@ -2216,10 +2216,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2216
2216
  return localVarFp.getBid(bidRef, ifNoneMatch, options).then((request) => request(axios, basePath));
2217
2217
  },
2218
2218
  /**
2219
- * 낙찰 공급사의 사업자·계좌·공급가액/부가세·응찰 품목내역을 조회합니다. 대금 지급에 필요한 정보입니다. 다른 조회에서 일부 참가자 정보가 가려지는 경우와 무관하게, 이 정산 정보는 읽기 전용으로 항상 그대로 제공됩니다. **필수 스코프:** `invoices:read` — 종전에는 `bids:read` 요구했습니다. 대금·계좌가 실리는 응답이라 공고 조회 권한과 분리했습니다. 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
2219
+ * 낙찰 공급사의 사업자·계좌 정보와 공급가액·부가세, 응찰 품목내역을 조회합니다. 대금 지급에 필요한 값입니다. 스코프 `invoices:read`(종전 `bids:read`에서 변경). 다른 조회에서 참가자 정보가 가려지는 경우와 무관하게응답은 항상 그대로 나갑니다.
2220
2220
  * @summary 정산 정보 조회
2221
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2222
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2221
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2222
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2223
2223
  * @param {*} [options] Override http request option.
2224
2224
  * @throws {RequiredError}
2225
2225
  */
@@ -2227,11 +2227,11 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2227
2227
  return localVarFp.getBidSettlement(bidRef, ifNoneMatch, options).then((request) => request(axios, basePath));
2228
2228
  },
2229
2229
  /**
2230
- * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. **필수 스코프:** `invoices:read` — 종전에는 `contracts:read` 를 요구했습니다. 금액이 실리는 정산 계열 문서라 계약서류 조회 권한과 분리했습니다. 이 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
2230
+ * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. 스코프 `invoices:read`(종전 `contracts:read`에서 변경).
2231
2231
  * @summary 거래명세서 조회
2232
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2232
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2233
2233
  * @param {number} [paperCode] 거래명세서 서식 코드. 생략하면 해당 공고에 적용된 기본 서식으로 조회합니다. 기관에 서식이 여러 벌인 경우에만 지정하세요.
2234
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2234
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2235
2235
  * @param {*} [options] Override http request option.
2236
2236
  * @throws {RequiredError}
2237
2237
  */
@@ -2239,10 +2239,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2239
2239
  return localVarFp.getBidStatement(bidRef, paperCode, ifNoneMatch, options).then((request) => request(axios, basePath));
2240
2240
  },
2241
2241
  /**
2242
- * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey` 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName` 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
2242
+ * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey`만 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName`에 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
2243
2243
  * @summary 파일 정보 조회
2244
2244
  * @param {string} fileKey 파일 키 — 업로드 응답의 fileKey(영문 대소문자·숫자 32자).
2245
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2245
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2246
2246
  * @param {*} [options] Override http request option.
2247
2247
  * @throws {RequiredError}
2248
2248
  */
@@ -2260,10 +2260,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2260
2260
  return localVarFp.getSemoContractTaxinvoiceStatus(externalContractId, options).then((request) => request(axios, basePath));
2261
2261
  },
2262
2262
  /**
2263
- * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write` 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
2263
+ * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write`를 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
2264
2264
  * @summary 공급사 카드결제 가능 여부
2265
2265
  * @param {string} memberId 계약업체 회원 ID
2266
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2266
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2267
2267
  * @param {*} [options] Override http request option.
2268
2268
  * @throws {RequiredError}
2269
2269
  */
@@ -2271,10 +2271,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2271
2271
  return localVarFp.getSupplierCardPayableV2(memberId, ifNoneMatch, options).then((request) => request(axios, basePath));
2272
2272
  },
2273
2273
  /**
2274
- * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 `endpointId` 확인하세요. **필수 스코프:** `webhooks:read`
2274
+ * 구독 1건의 현재 상태를 조회합니다. 스코프 `webhooks:read`. 수정·삭제 전에 먼저 호출해 응답 헤더의 `ETag`를 `If-Match`에 실어야 합니다. 없는 구독이거나 다른 파트너 키의 구독이면 404입니다. 서명 시크릿은 실리지 않습니다.
2275
2275
  * @summary 웹훅 구독 단건 조회
2276
2276
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2277
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2277
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2278
2278
  * @param {*} [options] Override http request option.
2279
2279
  * @throws {RequiredError}
2280
2280
  */
@@ -2284,7 +2284,7 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2284
2284
  /**
2285
2285
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
2286
2286
  * @summary Partner API 헬스체크
2287
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2287
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2288
2288
  * @param {*} [options] Override http request option.
2289
2289
  * @throws {RequiredError}
2290
2290
  */
@@ -2292,10 +2292,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2292
2292
  return localVarFp.healthControllerCheck(ifNoneMatch, options).then((request) => request(axios, basePath));
2293
2293
  },
2294
2294
  /**
2295
- * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. **이 엔드포인트를 폴링에 쓰세요.** 공고를 하나씩 조회하는 대신 최대 100건을 한 왕복으로 받습니다. 응답에 실린 `ETag` 다음 요청의 `If-None-Match` 되보내면, 결과가 그대로일 때 `304` 본문 없이 받습니다. **식별자 전달:** `?bidRefs=A,B,C`(쉼표) 또는 `?bidRefs=A&bidRefs=B`(반복) 둘 다 됩니다. **없는 공고는 응답에서 빠집니다.** 존재하지 않거나 대행 범위 밖인 식별자는 오류가 아니라 누락으로 처리됩니다. 요청한 건수와 받은 건수가 다를 수 있으므로, 보낸 값이 공고번호였다면 `bidId` 로, 구매번호였다면 `purchaseNo` 로 대조하세요. **공고 하나만 볼 때도** `bidRefs` 에 하나만 넣으면 됩니다. 응찰 결과 외에 납품 조건·품목·계약서류까지 필요하면 `GET /v2/bids/{bidRef}` 상세 조회를 쓰세요.
2295
+ * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. - 결과 확인은 공고를 하나씩 조회하지 말고 이 엔드포인트로 최대 100건씩 받습니다. 응답의 `ETag`를 다음 요청의 `If-None-Match`로 보내면 변화가 없을본문 없이 `304`로 끝납니다. - 식별자는 `?bidRefs=A,B,C`와 `?bidRefs=A&bidRefs=B` 둘 다 됩니다. - 없거나 대행 범위 밖인 식별자는 오류가 아니라 응답에서 빠집니다. 보낸 값이 공고번호면 `bidId`, 구매번호면 `purchaseNo`로 대조합니다.
2296
2296
  * @summary 공고 결과 조회
2297
- * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60; 반복해 전달합니다. 최대 100건입니다.
2298
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2297
+ * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60;를 반복해 전달합니다. 최대 100건입니다.
2298
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2299
2299
  * @param {*} [options] Override http request option.
2300
2300
  * @throws {RequiredError}
2301
2301
  */
@@ -2303,14 +2303,14 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2303
2303
  return localVarFp.listBidResults(bidRefs, ifNoneMatch, options).then((request) => request(axios, basePath));
2304
2304
  },
2305
2305
  /**
2306
- * 발주처(API 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 다음 요청 `cursor` 전달하면 다음 페이지를 받습니다. `meta.hasMore` `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 관측합니다(AWARDED 상태는 없습니다).
2306
+ * API 키에 연결된 발주기관의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. - 발주기관은 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 페이지네이션: `limit`(1~100, 기본 100) `cursor`. 응답 `meta.nextCursor`를 다음 요청의 `cursor`로 보내고, `meta.hasMore`가 `false`면 마지막 페이지입니다. - 낙찰 여부는 공고 상태가 아니라 `GET /v2/bid-results`의 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없습니다.
2307
2307
  * @summary 공고 목록 조회
2308
2308
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
2309
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달한다. 미지정 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
2310
- * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV 로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
2309
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 보냅니다. 생략하면페이지이고, &#x60;nextCursor&#x60;가 &#x60;null&#x60;이면 마지막 페이지입니다.
2310
+ * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
2311
2311
  * @param {Array<BidPublicStatus>} [status] 공고 상태 필터(공개값) CSV. 지정 시 그중 하나라도 일치하는 공고만 조회합니다.
2312
2312
  * @param {Array<ListBidsIncludeEnum>} [include] 행별 확장 부착 CSV. &#x60;results&#x60;&#x3D;응찰 참여자, &#x60;products&#x60;&#x3D;공고 등록 품목, &#x60;contacts&#x60;&#x3D;발주 담당자 성명·연락처·이메일. 미지정이면 부착하지 않는다(응답이 가볍고 조회 비용도 들지 않는다).
2313
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2313
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2314
2314
  * @param {*} [options] Override http request option.
2315
2315
  * @throws {RequiredError}
2316
2316
  */
@@ -2318,7 +2318,7 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2318
2318
  return localVarFp.listBids(limit, cursor, bidRefs, status, include, ifNoneMatch, options).then((request) => request(axios, basePath));
2319
2319
  },
2320
2320
  /**
2321
- * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market 이 데이터를 채워 PDF 로 만들어 주는 서류입니다. 생성 API 의 `paperCodes` 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2321
+ * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market이 데이터를 채워 PDF로 만들어 주는 서류입니다. 생성 API의 `paperCodes`에 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2322
2322
  * @summary 거래에 필요한 계약서류 목록 조회
2323
2323
  * @param {string} buyerId 발주기관 회원 ID(c-market memberId).
2324
2324
  * @param {ListExternalContractDocumentsBidTypeEnum} bidType 거래유형.
@@ -2329,13 +2329,13 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2329
2329
  return localVarFp.listExternalContractDocuments(buyerId, bidType, options).then((request) => request(axios, basePath));
2330
2330
  },
2331
2331
  /**
2332
- * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 걸러 다시 처리하면 됩니다. - \"이벤트가 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 같고 `attempt` 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 다음 요청의 `cursor` 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
2332
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문, 수신측 응답 상태, 다음 재시도 시각이 함께 실립니다. 스코프 `webhooks:read`. - 수신측 장애로 놓친 이벤트는 `status=EXHAUSTED`로 걸러 다시 처리합니다. 웹훅의 폴링 대체 경로입니다. - 재시도마다 한 행이며 `eventId`가 같고 `attempt`만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단합니다. - 페이지네이션: 응답 `nextCursor`를 다음 요청의 `cursor`로 보냅니다. `null`이면 마지막 페이지입니다.
2333
2333
  * @summary 웹훅 전송 이력 조회
2334
2334
  * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
2335
2335
  * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
2336
2336
  * @param {number} [limit] 페이지 크기(1~200, 기본 50).
2337
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달합니다. 미지정 시 첫 페이지.
2338
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2337
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 전달합니다. 미지정 시 첫 페이지.
2338
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2339
2339
  * @param {*} [options] Override http request option.
2340
2340
  * @throws {RequiredError}
2341
2341
  */
@@ -2343,9 +2343,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2343
2343
  return localVarFp.listWebhookDeliveries(endpointId, status, limit, cursor, ifNoneMatch, options).then((request) => request(axios, basePath));
2344
2344
  },
2345
2345
  /**
2346
- * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. **호출 시점:** 연동 상태를 점검할 때, 또는 발송이 멈춘 이유(`status`·`consecutiveFailures`)를 확인할 때. 서명 시크릿은 여기에 실리지 않습니다. **필수 스코프:** `webhooks:read` ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 을 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 — JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 을 계산해 **base64** 로 인코딩하고, `webhook-signature` 의 `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 는 공백으로 구분된 **여러 서명**을 실을 수 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** — 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 과 같은 값)도 실립니다 — 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 — 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 로 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 로 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 은 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2346
+ * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. 스코프 `webhooks:read`. 발송이 멈춘 이유는 `status`와 `consecutiveFailures`로 확인합니다. 서명 시크릿은 실리지 않습니다. 수신측 구현 방법은 `POST /v2/webhook-endpoints` 설명에 있습니다.
2347
2347
  * @summary 웹훅 구독 목록 조회
2348
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2348
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2349
2349
  * @param {*} [options] Override http request option.
2350
2350
  * @throws {RequiredError}
2351
2351
  */
@@ -2353,10 +2353,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2353
2353
  return localVarFp.listWebhookEndpoints(ifNoneMatch, options).then((request) => request(axios, basePath));
2354
2354
  },
2355
2355
  /**
2356
- * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(FAILED)로 전환됩니다. - 유찰사유 코드와 상세가 기록됩니다. **유찰사유 값 목록(failureReasonCode 공개값):** | | 의미 | |------|------| | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `OTHER` | 기타 (`failureReasonDetail` 필수) | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2356
+ * 공고를 유찰 처리합니다. 입찰 마감 상태에서 호출합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. 공고 상태가 유찰(`FAILED`)로 바뀌고 유찰사유가 기록됩니다. 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). | `failureReasonCode` | 의미 | | --- | --- | | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | | `OTHER` | 기타(`failureReasonDetail` 필수) |
2357
2357
  * @summary 유찰 처리
2358
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2359
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2358
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2359
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2360
2360
  * @param {MarkBidFailedRequestDto} markBidFailedRequestDto
2361
2361
  * @param {*} [options] Override http request option.
2362
2362
  * @throws {RequiredError}
@@ -2365,10 +2365,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2365
2365
  return localVarFp.markBidFailed(bidRef, idempotencyKey, markBidFailedRequestDto, options).then((request) => request(axios, basePath));
2366
2366
  },
2367
2367
  /**
2368
- * 낙찰 결과를 등록합니다. 요청의 응답은 처리 상태 `AWARDED` 반환합니다. **호출 시점:** 입찰 마감 후 낙찰자가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 낙찰자(공급사)의 응찰 건이 낙찰 처리됩니다. - 이후 **공고의 조회 상태(status)는 계약진행(CONTRACT_IN_PROGRESS)** 으로 진행합니다. `AWARDED` 라는 공고 status 존재하지 않으므로, 낙찰 여부는 `GET /v2/bids/{bidRef}/results` 의 `participants[].isWinner` 또는 `GET /v2/bids/{bidRef}` 의 status(=계약진행)로 관측하세요(`status === \'AWARDED\'` 폴링 금지). - 협상 방식(NEGOTIATION/NEGOTIATION_AUTO) 공고는 이 엔드포인트 전에 `POST /v2/bids/{bidRef}/negotiation-scores`(협상 점수평가)로 평가를 완료해야 합니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 24시간 캐시 응답 반환.
2368
+ * 낙찰 결과를 등록합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감(입찰완료) 상태에서 호출합니다. - 낙찰 공고 상태는 계약진행(`CONTRACT_IN_PROGRESS`)입니다. `AWARDED` 공고 상태는 없으므로 낙찰 여부는 `participants[].isWinner`로 판단합니다. - 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고는 `POST /v2/bids/{bidRef}/negotiation-scores`로 평가를 마쳐야 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 같은 키와 같은 body 재전송하면 24시간 동안 캐시된 응답을 돌려줍니다.
2369
2369
  * @summary 낙찰 결과 전송
2370
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2371
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2370
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2371
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2372
2372
  * @param {RegisterAwardRequestDto} registerAwardRequestDto
2373
2373
  * @param {*} [options] Override http request option.
2374
2374
  * @throws {RequiredError}
@@ -2377,9 +2377,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2377
2377
  return localVarFp.registerAward(bidRef, idempotencyKey, registerAwardRequestDto, options).then((request) => request(axios, basePath));
2378
2378
  },
2379
2379
  /**
2380
- * 입찰 정보 등록. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **첨부는 2단계입니다.** 파일을 요청 본문에 직접 싣지 마세요 먼저 `POST /v2/files`(base64 또는 url)로 올려 `fileKey` 받고, 32자 키를 요청의 `attachments` 배열에 넣습니다.
2380
+ * 공고를 등록합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. 첨부는 방법 하나입니다. - `attachments` 원소에 `{ fileName, url }` 또는 `{ fileName, base64 }`를 그대로 넣습니다. - 여러 공고에서 재사용할 파일은 `POST /v2/files`로 먼저 올려 받은 `fileKey`를 넣습니다.
2381
2381
  * @summary 공고 등록
2382
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2382
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2383
2383
  * @param {CreateBidRequestDto} createBidRequestDto
2384
2384
  * @param {*} [options] Override http request option.
2385
2385
  * @throws {RequiredError}
@@ -2390,7 +2390,7 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2390
2390
  /**
2391
2391
  * 외부에서 맺어진 계약 1건을 씨마켓의 **세금계산서 발행 대상**으로 등록합니다. **등록 후 동선:** 발주기관이 씨마켓 [나의 계약 관리] 에서 계산서 발급을 요청하고, 공급기업이 같은 화면에서 발행합니다. 계산서의 **공급자는 공급기업, 공급받는자는 발주기관**입니다. **대금 흐름:** 씨마켓은 이 거래의 대금을 받지 않습니다 — 발행 경로만 제공합니다. **금액:** `supplyPrice` 는 **부가세를 뺀 과세 공급가액**입니다(결제창 API 가 부가세 포함가를 받는 것과 다릅니다). 과세·면세 공급가액이 모두 0 이면 400 입니다. **사전 조건:** 두 회원 ID 가 씨마켓에 실재해야 합니다. 회원 ID 가 곧 소유권이라, 없는 회원으로 등록하면 아무도 열 수 없는 계산서 대상이 됩니다. **필수 스코프:** `contracts:write`. 바인딩된 발주처 외의 발주기관을 대신하려면 대행 범위에 그 회원이 있어야 합니다. **멱등성:** `externalContractId` 가 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 대상을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2392
2392
  * @summary 계약 발행대상 등록
2393
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2393
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2394
2394
  * @param {RegisterSemoContractRequestDto} registerSemoContractRequestDto
2395
2395
  * @param {*} [options] Override http request option.
2396
2396
  * @throws {RequiredError}
@@ -2399,10 +2399,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2399
2399
  return localVarFp.registerSemoContract(idempotencyKey, registerSemoContractRequestDto, options).then((request) => request(axios, basePath));
2400
2400
  },
2401
2401
  /**
2402
- * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write`. **청구만 접수합니다.** 호출이 계산서를 발행하지는 않습니다 접수된 청구는 정산 파이프라인이 처리하며, 진행 여부는 `GET /v2/bids/{bidRef}` `taxInvoiceRequested` 관측합니다. **나눠 담을 금액을 보냅니다.** `supplyAmount`(공급가액)와 `vat`(부가세)는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 같은 공고에 청구를 한 번 더 보냅니다 — 그때는 **새 `Idempotency-Key`** 쓰세요. 같은 키로 다시 보내면 앞선 청구의 응답이 그대로 재생됩니다. **발급 희망일**(`issueDate`)은 선택이며 미래 일자는 400 입니다. 미지정 시 서버 기본값을 씁니다.
2402
+ * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write` · `Idempotency-Key` 헤더 필수. - 청구만 접수합니다. 발행은 정산 파이프라인이 처리하며 진행 여부는 `GET /v2/bids/{bidRef}`의 `taxInvoiceRequested`로 확인합니다. - `supplyAmount`와 `vat`는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 **새 `Idempotency-Key`**로 청구합니다. 같은 키는 앞선 청구의 응답을 그대로 돌려줍니다. - `issueDate`는 선택이며 미래 일자는 400입니다.
2403
2403
  * @summary 계산서 분할 발급 청구
2404
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2405
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2404
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2405
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2406
2406
  * @param {RequestInvoiceSplitRequestDto} requestInvoiceSplitRequestDto
2407
2407
  * @param {*} [options] Override http request option.
2408
2408
  * @throws {RequiredError}
@@ -2413,8 +2413,8 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2413
2413
  /**
2414
2414
  * 확정된 낙찰을 되돌려 공고를 낙찰대기(PENDING_AWARD) 상태로 보냅니다. 스코프 `awards:write` + `Idempotency-Key` 헤더 필수. **호출 시점:** 낙찰자가 계약을 포기했거나 낙찰 처리 자체가 잘못됐을 때. 되돌린 뒤 같은 공고에 다시 낙찰을 등록할 수 있습니다. **되돌릴 수 없는 경우 → 409:** - 수수료 결제가 이미 완료된 공고 - 세금계산서가 이미 발행된 공고 - 수입권공매 계열 낙찰방법(다수 낙찰자 구조라 되돌리기 단위가 다릅니다) **사유는 필수입니다** — 감사 대상 행위이며 공고 이력에 남습니다. **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
2415
2415
  * @summary 낙찰 되돌리기
2416
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2417
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2416
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2417
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2418
2418
  * @param {RevertAwardRequestDto} revertAwardRequestDto
2419
2419
  * @param {*} [options] Override http request option.
2420
2420
  * @throws {RequiredError}
@@ -2423,10 +2423,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2423
2423
  return localVarFp.revertAward(bidRef, idempotencyKey, revertAwardRequestDto, options).then((request) => request(axios, basePath));
2424
2424
  },
2425
2425
  /**
2426
- * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
2426
+ * 서명 시크릿을 새로 발급합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 시크릿은 이 응답에서 한 번만 나가고 `secretVersion`이 1 올라갑니다. - **옛 시크릿은 즉시 무효입니다.** 유예가 없으므로 순서를 지키세요 — ① 수신측이 옛 값과 새 값을 모두 받아들이도록 배포 → ② 이 호출 → ③ 새 반영 → ④ 옛 값 제거. - 같은 `Idempotency-Key`로 다시 부르면 새로 발급하지 않고 처음 발급한 값을 돌려줍니다(24시간).
2427
2427
  * @summary 웹훅 서명 시크릿 재발급
2428
2428
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2429
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2429
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2430
2430
  * @param {*} [options] Override http request option.
2431
2431
  * @throws {RequiredError}
2432
2432
  */
@@ -2434,10 +2434,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2434
2434
  return localVarFp.rotateWebhookSecret(endpointId, idempotencyKey, options).then((request) => request(axios, basePath));
2435
2435
  },
2436
2436
  /**
2437
- * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` `delivered: false` 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
2437
+ * 등록된 주소로 `ping` 이벤트를 1회 보내고 결과를 돌려줍니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 수신측이 받지 못해도 응답은 200이고 `delivered: false`입니다. 원인은 `responseStatus`와 `error`로 좁힙니다. - 실제 이벤트와 같은 서명 헤더가 실리므로 검증 코드를 그대로 시험할 수 있습니다. - 다시 보내려면 `Idempotency-Key`를 쓰세요. 같은 키는 24시간 동안 직전 결과를 돌려줍니다.
2438
2438
  * @summary 웹훅 연결 확인 발송
2439
2439
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2440
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2440
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2441
2441
  * @param {*} [options] Override http request option.
2442
2442
  * @throws {RequiredError}
2443
2443
  */
@@ -2445,10 +2445,10 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2445
2445
  return localVarFp.sendWebhookTestEvent(endpointId, idempotencyKey, options).then((request) => request(axios, basePath));
2446
2446
  },
2447
2447
  /**
2448
- * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
2448
+ * 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고의 응찰자별 점수를 입력합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전에 호출합니다. 협상 방식 공고는 이 평가를 마쳐야 낙찰에 진입합니다. - `complete=true`면 평가완료로 처리되어 낙찰을 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다).
2449
2449
  * @summary 협상 점수평가
2450
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2451
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2450
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2451
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2452
2452
  * @param {SubmitNegotiationScoresRequestDto} submitNegotiationScoresRequestDto
2453
2453
  * @param {*} [options] Override http request option.
2454
2454
  * @throws {RequiredError}
@@ -2457,11 +2457,11 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2457
2457
  return localVarFp.submitNegotiationScores(bidRef, idempotencyKey, submitNegotiationScoresRequestDto, options).then((request) => request(axios, basePath));
2458
2458
  },
2459
2459
  /**
2460
- * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. 진행중/초안 상태의 공고만 수정할 수 있습니다. **부수효과:** - 변경 내용이 반영되고 수정이력이 기록됩니다. - `hideEditHistory=true` 면 변경이력을 비공개 처리하고 노출 카운터 증가를 생략합니다. **수정 제약:** - 낙찰방법(awardMethod)은 수정 불가(잠금). - 참여자가 있으면 입찰방식/면허/예산/품목 일부가 잠깁니다. - 마감/취소된 공고는 수정할 수 없습니다. 한 섹션을 수정하려면 해당 섹션의 필수 필드를 함께 보내야 합니다(부분 섹션은 거부됨).
2460
+ * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 진행중·초안 상태만 수정할 수 있습니다. 마감·취소된 공고는 거부됩니다. - 낙찰방법(`awardMethod`)은 수정할 없고, 참여자가 있으면 입찰방식·면허·예산·품목 일부가 잠깁니다. - 한 섹션을 수정하려면 섹션의 필수 필드를 함께 보냅니다. - `hideEditHistory=true`면 변경이력을 비공개로 남기고 노출 카운터를 올리지 않습니다.
2461
2461
  * @summary 공고 수정
2462
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2463
- * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412 로 거절되며 아무것도 수정되지 않습니다.
2464
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2462
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2463
+ * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412로 거절되며 아무것도 수정되지 않습니다.
2464
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2465
2465
  * @param {UpdateBidRequestDto} updateBidRequestDto
2466
2466
  * @param {*} [options] Override http request option.
2467
2467
  * @throws {RequiredError}
@@ -2470,11 +2470,11 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2470
2470
  return localVarFp.updateBid(bidRef, ifMatch, idempotencyKey, updateBidRequestDto, options).then((request) => request(axios, basePath));
2471
2471
  },
2472
2472
  /**
2473
- * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 헤더가 없으면 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` 헤더를 빼먹었습니다. 조회 `ETag` 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2473
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - `eventTypes`는 치환입니다. 하나를 더하려면 기존 목록을 포함한 전체를 보냅니다. - `If-Match`가 필수입니다. `GET`으로 받은 `ETag`를 그대로 실으세요. 누락은 428, 사이 구독이 바뀌었으면 412이며 아무것도 수정되지 않습니다. - 연속 실패로 자동 중지된 구독은 `{\"status\":\"ACTIVE\"}`로 되살립니다. - 시크릿은 이 경로로 바뀌지 않습니다. 재발급은 `rotate-secret`입니다.
2474
2474
  * @summary 웹훅 구독 수정
2475
2475
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2476
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2477
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2476
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
2477
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2478
2478
  * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
2479
2479
  * @param {*} [options] Override http request option.
2480
2480
  * @throws {RequiredError}
@@ -2483,9 +2483,9 @@ const PartnerApiApiFactory = function (configuration, basePath, axios) {
2483
2483
  return localVarFp.updateWebhookEndpoint(endpointId, ifMatch, idempotencyKey, updateWebhookEndpointRequestDto, options).then((request) => request(axios, basePath));
2484
2484
  },
2485
2485
  /**
2486
- * **첨부 업로드의 기본 경로입니다. 23MB 이하면 호출 하나로 끝납니다.** 파일 본문을 `base64` 또는 `url` 중 정확히 하나로 제출하면 `fileKey` 를 돌려줍니다. 이 값을 공고 등록·수정의 첨부 필드에 실으세요. **23MB 를 넘으면 경로를 바꿔야 합니다.** 상한이 셋으로 갈립니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | **23MB** (본문이 c-market 을 통과하며 base64 팽창 4/3 이 얹힘) | 1 | | 이 호출 + `url` | **30MB** (c-market 이 대신 내려받아 팽창은 없지만 서버 경유 천장은 그대로) | 1 | | `POST /v2/files/upload-url` 로 시작하는 2단계 | **100MB** (바이트가 c-market 을 지나지 않음) | 2 + 스토리지 PUT | c-market 내려받을 있는 https 주소에 파일을 올려 둘 수 있다면 `url` 이 30MB 까지를 1콜로 덮습니다. 그 이상이거나 주소를 열 수 없으면 2단계 경로를 쓰세요. **공고 등록에 파일을 함께 실을 수도 있습니다.** `POST /v2/bids` `attachments` 원소에 `{ fileName, url }`·`{ fileName, base64 }` 그대로 넣으면 호출 없이 번에 끝납니다. 여러 공고에 같은 파일을 재사용하거나 큰 파일을 다룰 때만 `fileKey` 를 먼저 만드세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2486
+ * 공고 첨부파일을 올리고 `fileKey`를 받습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. `base64`와 `url` 중 하나만 보냅니다. 받은 `fileKey`는 공고 등록·수정의 `attachments`에 넣습니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | 23MB | 1 | | 이 호출 + `url` | 30MB | 1 | | `POST /v2/files/upload-url` 2단계 | 100MB | 2 + 스토리지 PUT | 공고에만 쓰는 파일이면 `POST /v2/bids`의 `attachments`에 `url`·`base64`를 직접 넣어호출을 생략할 있습니다.
2487
2487
  * @summary 공고 첨부파일 업로드 (기본)
2488
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2488
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2489
2489
  * @param {UploadFileRequestDto} uploadFileRequestDto
2490
2490
  * @param {*} [options] Override http request option.
2491
2491
  * @throws {RequiredError}
@@ -2501,10 +2501,10 @@ exports.PartnerApiApiFactory = PartnerApiApiFactory;
2501
2501
  */
2502
2502
  class PartnerApiApi extends base_1.BaseAPI {
2503
2503
  /**
2504
- * 진행중인 공고를 취소합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **되돌릴없습니다.** 취소 사유는 필수이며 공고 이력에 남습니다. **전제조건:** 진행중(ONGOING) 상태여야 합니다. **거부:** 진행중이 아니거나 이미 취소된 공고 409. 발주처 공고 403. **마감과의 차이:** 취소는 공고를 무효로 되돌리는 것이고, 유찰(`POST /v2/bids/{bidRef}/fail`)은 응찰을 받았으나 낙찰자를 정하지 못한 종료입니다.
2504
+ * 진행중(`ONGOING`) 공고를 취소합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 되돌릴 없습니다. 취소 사유는 필수이고 공고 이력에 남습니다. - 진행중이 아니거나 이미 취소된 공고는 409, 다른 발주기관의 공고는 403입니다. - 응찰은 받았으나 낙찰자를 정하지 못한 종료는 취소가 아니라 유찰(`POST /v2/bids/{bidRef}/fail`)입니다.
2505
2505
  * @summary 공고 취소
2506
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2507
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2506
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2507
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2508
2508
  * @param {CancelBidRequestDto} cancelBidRequestDto
2509
2509
  * @param {*} [options] Override http request option.
2510
2510
  * @throws {RequiredError}
@@ -2513,10 +2513,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2513
2513
  return (0, exports.PartnerApiApiFp)(this.configuration).cancelBid(bidRef, idempotencyKey, cancelBidRequestDto, options).then((request) => request(this.axios, this.basePath));
2514
2514
  }
2515
2515
  /**
2516
- * 낙찰 공고의 검수(납품 검수)가 완료되었음을 기록합니다. **호출 시점:** 낙찰자(공급사)가 납품을 완료하고 구매자가 검수를 확인한 시점입니다. 공고 상태가 낙찰(AWARDED) 상태여야 합니다. **부수효과:** - 검수완료 상태가 기록됩니다. - 현금 결제 공고는 세금계산서 발행요청이 등록되고, 낙찰자(공급사)에게 발행요청 알림·문자가 발송됩니다. 카드 결제 공고는 발행요청 축이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 응답 코드는 200이며, 처리 결과가 본문에 담겨 반환됩니다. **부분계약(협의 감액):** 낙찰 후 협의로 계약금액이 줄었으면 `supplyAmount`+`vat` 함께 보내세요. 그 금액으로 계산서 발행이 요청됩니다. 생략하면 낙찰금액에서 파생합니다. 현금 결제 공고·낙찰자 1인·감액(증액 불가)일 때만 허용되며, 어긋나면 409 입니다. **문서에 찍히는 값:** 거래명세서·검수보고서의 구매사 사업자정보·담당자·작성일자는 등록된 발주처 정보에서 채워집니다. 요청으로 덮어쓸 수 없습니다. **낙찰자:** 공고의 낙찰 상태에서 결정되며 요청으로 지정하지 않습니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2516
+ * 납품 검수 완료를 기록합니다. 낙찰 처리된 공고에서 호출합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 현금 결제 공고는 세금계산서 발행요청이 등록되고 낙찰자에게 알림·문자가 나갑니다. 카드 결제 공고는 발행요청이 없어 알림도 없습니다. - 거래명세서 발행이 예약됩니다. - 협의로 계약금액이 줄었으면 `supplyAmount`와 `vat`를 함께 보냅니다. 현금 결제·낙찰자 1인·감액일 때만 허용하며 어긋나면 409입니다. 생략하면 낙찰금액에서 파생합니다. - 문서에 찍히는 구매사 사업자정보·담당자·작성일자와 낙찰자는 등록된 값에서 채워지며 요청으로 바꿀 수 없습니다.
2517
2517
  * @summary 검수완료 전송
2518
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2519
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2518
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2519
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2520
2520
  * @param {CompleteAcceptanceRequestDto} completeAcceptanceRequestDto
2521
2521
  * @param {*} [options] Override http request option.
2522
2522
  * @throws {RequiredError}
@@ -2525,10 +2525,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2525
2525
  return (0, exports.PartnerApiApiFp)(this.configuration).completeAcceptance(bidRef, idempotencyKey, completeAcceptanceRequestDto, options).then((request) => request(this.axios, this.basePath));
2526
2526
  }
2527
2527
  /**
2528
- * `uploadUrl` 로의 `PUT` 이 끝난 뒤 호출합니다. 올라온 파일을 실측해 등록하고, 시점부터 `fileKey` 공고 첨부로 쓸 수 있습니다. **확정 `fileKey` 첨부로 없습니다** 공고 등록이 400 으로 거절됩니다. **신고한 크기가 아니라 실제 파일을 봅니다.** 발급 요청의 `fileSize` 와 다르면 실제 크기가 기록되고, 정책 상한을 넘으면 여기서 거절됩니다. **같은 `fileKey` 여러 번 호출해도 안전합니다**(멱등). **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2528
+ * `uploadUrl`로 올린 파일을 확정합니다. 시점부터 `fileKey`를 공고 첨부로 쓸 수 있습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. - 확정 `fileKey`를 첨부로 쓰면 공고 등록이 400입니다. - 신고한 `fileSize`가 아니라 실제 파일을 측정해 기록하며, 정책 상한을 넘으면 여기서 거절됩니다. - 같은 `fileKey`로 여러 번 호출해도 안전합니다.
2529
2529
  * @summary 대용량 업로드 2/2 — 업로드 확정
2530
2530
  * @param {string} fileKey 발급 응답의 fileKey(영문 대소문자·숫자 32자).
2531
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2531
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2532
2532
  * @param {CompleteUploadRequestDto} completeUploadRequestDto
2533
2533
  * @param {*} [options] Override http request option.
2534
2534
  * @throws {RequiredError}
@@ -2537,10 +2537,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2537
2537
  return (0, exports.PartnerApiApiFp)(this.configuration).completeFileUpload(fileKey, idempotencyKey, completeUploadRequestDto, options).then((request) => request(this.axios, this.basePath));
2538
2538
  }
2539
2539
  /**
2540
- * 공급사로부터 계산서를 수령한 뒤, 계약을 완료처리 상태로 강제 전환합니다. **호출 시점:** 낙찰·계약 완료 후 공급사 계산서를 오프라인으로 수령했을 때. **부수효과:** - 결제완료·계산서 발급 상태가 기록되고 발급일자가 현재 시각으로 설정됩니다. **소유권:** 공고는 요청 파트너 키가 소유한 발주처 명의여야 합니다(타 발주처 공고 → 403). **이미 완료:** 이미 완료처리된 공고 재호출 → 409. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2540
+ * 공급사에게 계산서를 수령한 계약을 완료처리합니다. 스코프 `contracts:write` · `Idempotency-Key` 헤더 필수. - 결제완료·계산서 발급 상태가 기록되고 발급일자는 현재 시각이 됩니다. - 이미 완료된 공고는 409, 다른 발주기관의 공고는 403입니다.
2541
2541
  * @summary 정산 마감
2542
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2543
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2542
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2543
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2544
2544
  * @param {*} [options] Override http request option.
2545
2545
  * @throws {RequiredError}
2546
2546
  */
@@ -2548,9 +2548,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2548
2548
  return (0, exports.PartnerApiApiFp)(this.configuration).completeInvoice(bidRef, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2549
2549
  }
2550
2550
  /**
2551
- * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable` 미리 확인하세요. 미가입 업체로 발행하면 400 입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2551
+ * 발주기관이 특정 업체에게 카드로 지불하는 거래(결제창) 1건을 만듭니다. **대금 흐름:** 카드 승인이 **그 업체의 가맹점**으로 나가므로 대금은 씨마켓을 거치지 않고 업체로 직행합니다. **발행 직후 상태:** 자동 승인되어 바로 결제할 수 있습니다. **사용자 동선:** 응답의 `payUrl` 로 발주기관을 보내면 그 결제창 한 건만 걸러진 화면이 열립니다. **사전 조건:** 계약업체가 씨마켓 회원이고 카드결제에 가입(가맹)돼 있어야 합니다 — `GET /v2/suppliers/{memberId}/card-payable`로 미리 확인하세요. 미가입 업체로 발행하면 400입니다. **필수 스코프:** `payments:write`. 어느 발주기관을 대신할 수 있는지는 스코프가 아니라 API 키의 대행 범위 설정이 정합니다. **멱등성:** `externalRef`(파트너 측 거래 식별자)가 도메인 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 결제창을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2552
2552
  * @summary 결제창 발행
2553
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2553
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2554
2554
  * @param {CreateCardPaymentDto} createCardPaymentDto
2555
2555
  * @param {*} [options] Override http request option.
2556
2556
  * @throws {RequiredError}
@@ -2559,9 +2559,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2559
2559
  return (0, exports.PartnerApiApiFp)(this.configuration).createCardPayment(idempotencyKey, createCardPaymentDto, options).then((request) => request(this.axios, this.basePath));
2560
2560
  }
2561
2561
  /**
2562
- * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2562
+ * 공고 없이 성사된 거래의 계약서류를 생성합니다. **호출 시점:** 계약이 체결된 직후. **요청한 `paperCodes` 와 같은 순서로 같은 개수가 돌아옵니다.** 각 항목의 `fileUrl` 을 그대로 쓰면 되고, `paperCode` 로 어느 요청에 대한 결과인지 대응시킬 수 있습니다. **`name` 의 출처는 서류에 따라 다릅니다.** 시스템이 렌더한 서류는 계약서류명이고, 공급사 사전등록 3종(11·12·13)은 **공급사가 등록한 원본 파일명**입니다 — 채팅 첨부 라벨로 그대로 쓰세요. **필요한 입력:** 발주기관·공급사는 회원 ID 만 주면 됩니다. 상호·사업자번호·대표자·주소·직인은 c-market 이 회원 정보에서 직접 채웁니다. **전부 성공 또는 전부 실패입니다.** 지원하지 않는 서류가 하나라도 섞이면(400) 아무것도 만들지 않습니다. 렌더가 필요한 서류를 요청하면서 `contract` 를 빠뜨려도 마찬가지입니다(422). **135(수의계약체결제한여부확인서)를 요청하면 추가 입력이 필요합니다.** `contract.subject`(발주내용)·`contract.category`(계약구분)·`contract.buyerDepartment`(발주부서)가 필수이고, `documentInputs.contractRestrictionConfirm.answers`에 서식 ①~⑧에 대한 **계약상대자**의 답변 8개를 순서대로 담아야 합니다(c-market 이 대신 만들어낼 수 없는 값입니다). ⑨(발주자 확인사항)는 `documentInputs.contractRestrictionConfirm.buyerConfirmation`으로 선택 전달하며, 생략하면 서식에 빈칸으로 인쇄됩니다. 문항 ①~⑧의 원문은 `answers` 필드 설명을 참고하세요. **164(퇴직자영입현황확인서)를 요청하면 퇴직자 명단이 필요합니다.** `contract.subject`(서식의 \"수의계약 대상건명\")가 필수이고, `documentInputs.retireeRoster.rows` 에 명단을 넣습니다(성명·직급 필수, 직급·입사일·근무기간·비고 선택, 최대 50행). **퇴직자가 없으면 `rows` 를 빈 배열로 보내세요** — 서식에 \"해당사항 없음\"으로 인쇄됩니다. 블록 자체를 생략하면 422 입니다(\"퇴직자 없음\"과 \"확인하지 않음\"을 구분할 수 없기 때문입니다). **승낙사항(4·184·185·186·189·197·208)을 요청하면 `contract.subject`(계약건명)가 필수입니다.** 서식 상단 \"건명\" 칸에 인쇄되는 값이라 비면 어느 계약의 승낙인지 알 수 없습니다. 그 외 추가 입력은 없습니다 — 갑(발주기관) 서명란은 `buyerId` 로, 을(공급사) 서명란은 `supplierId` 로 c-market 이 채웁니다. 발주기관이 기관 전용 승낙사항 서식을 쓰면 요청한 코드 그대로 응답하되 PDF 는 그 기관 서식으로 발급됩니다. **응답의 `fileUrl` 은 만료되지 않습니다.** 채팅 메시지 등에 그대로 저장해 두어도 됩니다. **생성 가능한 회원 범위:** 조회와 같습니다 — 이 API 키에 설정된 대행 범위 안의 회원만 가능합니다. **필수 스코프:** `contracts:write` **멱등성:** `Idempotency-Key` 헤더 필수. --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2563
2563
  * @summary 계약서류 생성
2564
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2564
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2565
2565
  * @param {CreateExternalContractDocumentsRequestDto} createExternalContractDocumentsRequestDto
2566
2566
  * @param {*} [options] Override http request option.
2567
2567
  * @throws {RequiredError}
@@ -2570,9 +2570,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2570
2570
  return (0, exports.PartnerApiApiFp)(this.configuration).createExternalContractDocuments(idempotencyKey, createExternalContractDocumentsRequestDto, options).then((request) => request(this.axios, this.basePath));
2571
2571
  }
2572
2572
  /**
2573
- * 파일 본문을 스토리지로 **직접** 올리기 위한 1회용 서명 URL 발급합니다. 3단계로 씁니다. 1. 이 호출로 `fileKey` `uploadUrl` 받습니다. 2. `uploadUrl` 파일 본문을 `PUT` 합니다 응답의 `contentType` `Content-Type` 헤더에 그대로 실으세요. 요청은 c-market 거치지 않습니다. 3. `POST /v2/files/{fileKey}/complete` 확정합니다. **2단계는 이 명세에 오퍼레이션으로 나오지 않습니다** — 요청이 c-market 이 아니라 스토리지로 가기 때문입니다. 형태는 이게 전부입니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` ```ts import { readFile } from \'node:fs/promises\'; // 본문은 **파일 바이트 그대로**입니다 — JSON 도 multipart 도 아닙니다. await fetch(uploadUrl, { method: \'PUT\', headers: { \'Content-Type\': contentType }, body: await readFile(\'시방서.pdf\'), }); ``` **`Authorization` 헤더를 붙이지 마세요.** 자격증명이 `uploadUrl` 안에 서명으로 들어 있어 별도 인증이 필요 없습니다. 같은 이유로 주소는 **주소 자체가 자격증명**이므로 로그에 남기지 마세요. **2단계의 실패 응답은 problem+json 아닙니다.** 스토리지가 직접 답하므로 본문 형식이 다릅니다 — c-market 에러 파서에 넣지 마세요. 만료(`400`)·중복 업로드(`409`)라면 1단계부터 다시 하세요. **`POST /v2/files` 와 언제 갈리나:** 기본은 `POST /v2/files` 한 번입니다 — `base64` 로 23MB, `url` 로 30MB 까지 그 한 번으로 끝납니다. 그 위(**100MB** 까지)만 이 2단계 경로를 쓰세요. 바이트가 c-market 을 지나지 않아 서버 경유 천장을 받지 않습니다. **`uploadUrl` 1회용입니다.** 덮어쓰기가 막혀 있고 `expiresIn` 만료됩니다 저장해 두고 재사용하지 마시고, 만료됐다면 호출부터 다시 하세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2573
+ * 파일을 스토리지로 직접 올리기 위한 1회용 서명 URL을 발급합니다(100MB까지). 스코프 `files:write` · `Idempotency-Key` 헤더 필수. 1. 이 호출로 `fileKey`와 `uploadUrl`을 받습니다. 2. `uploadUrl`에 파일 바이트를 그대로 `PUT` 합니다. 응답의 `contentType`을 `Content-Type` 헤더에 싣고, `Authorization` 헤더는 붙이지 않습니다(주소 자체가 자격증명입니다). 3. `POST /v2/files/{fileKey}/complete`로 확정합니다. ```bash curl -X PUT \"$uploadUrl\" -H \"Content-Type: $contentType\" --upload-file 시방서.pdf ``` - 2단계는 요청이 스토리지로 가므로명세에 오퍼레이션이 없고, 실패 본문도 problem+json이 아닙니다. 만료(400)·중복 업로드(409) 1단계부터 다시 합니다. - `uploadUrl`은 1회용이며 `expiresIn`초만료됩니다. 주소가 자격증명이므로 로그에 남기지 않습니다. - 30MB 이하는 `POST /v2/files` 번으로 끝납니다.
2574
2574
  * @summary 대용량 업로드 1/2 — 업로드 주소 발급
2575
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2575
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2576
2576
  * @param {CreateUploadUrlRequestDto} createUploadUrlRequestDto
2577
2577
  * @param {*} [options] Override http request option.
2578
2578
  * @throws {RequiredError}
@@ -2581,9 +2581,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2581
2581
  return (0, exports.PartnerApiApiFp)(this.configuration).createFileUploadUrl(idempotencyKey, createUploadUrlRequestDto, options).then((request) => request(this.axios, this.basePath));
2582
2582
  }
2583
2583
  /**
2584
- * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 1회. 수신 주소가 바뀌면 새로 만들지 말고 `PATCH` 고치세요 — 그래야 시크릿과 전송 이력이 유지됩니다. **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 응답의 `secret` 을 즉시 안전한 곳에 보관하세요. 잃어버렸다면 복구가 아니라 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret` 으로 **재발급**해야 합니다. **거절되는 경우와 고치는 법:** - `400` `url` HTTPS 아니거나 형식이 잘못됨, `eventTypes` 비었거나 목록 값 (`ping` 은 구독 불가). 값을 고쳐 재시도하세요. - `400` `Idempotency-Key` 헤더 누락/형식 오류. UUID v4 를 실어 보내세요. - `403` 토큰에 `webhooks:write` 스코프가 없음. 키 발급 설정을 넓혀야 합니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 — 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 계산해 **base64** 인코딩하고, `webhook-signature` `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 공백으로 구분된 **여러 서명**을 실을 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 같은 값)도 실립니다 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2584
+ * 수신 주소와 구독할 이벤트를 등록합니다. 연동 초기 1 호출합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - **서명 시크릿은 이 응답에서 한 번만 나갑니다.** 서버는 해시만 보관하므로 조회로 다시 받을 수 없습니다. 잃어버렸다면 `POST /v2/webhook-endpoints/{endpointId}/rotate-secret`으로 재발급합니다. - 수신 주소가 바뀌면 새로 만들지 말고 `PATCH`로 고치세요. 시크릿과 전송 이력이 유지됩니다. - `url`은 HTTPS만 허용하고 `eventTypes`는 아래 목록 안의 값이어야 합니다. 어기면 400입니다. ### 서명 검증 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약입니다. 직접 짜지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿(`whsec_…`)을 그대로 넘기세요. ```ts import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); // 실패하면 예외 ``` 라이브러리를 쓸 수 없다면 헤더 셋으로 직접 검증합니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 base64 디코드한 바이트가 HMAC 키입니다. 2. `{webhook-id}.{webhook-timestamp}.{본문}`을 연결합니다. 본문은 **파싱 전 원문 바이트**여야 합니다. JSON을 다시 직렬화하면 순서·공백이 달라져 서명이 어긋납니다. 3. HMAC-SHA256을 base64로 인코딩해 `webhook-signature`의 `v1,` 뒤 값과 상수 시간 함수로 비교합니다. 4. `webhook-timestamp`가 5 이상 지났으면 거절합니다. `webhook-signature`에는 서명이 여러 실릴있으므로(키 회전용) 하나라도 맞으면 통과로 처리하세요. ### 중복 제거 `webhook-id`가 이벤트 식별자입니다. 재시도에도 같은 값이 오므로 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상이며 중복 제거는 수신측 책임입니다. `webhook-event-type` 헤더에 본문 `type`과 같은 값이 실려, 본문을 파싱하기 전에 거를 수 있습니다. ### 재시도와 자동 중지 2xx를 돌려주면 성공입니다. 그 외에는 최대 7회 재시도하며 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간입니다. 처리가 길면 먼저 2xx를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 `DISABLED`로 내려갑니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}`에 `{\"status\":\"ACTIVE\"}`로 되살리세요. ### 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping`은 연결 확인 전용이라 구독할 수 없습니다. 놓친 이벤트는 `GET /v2/webhook-deliveries`로 조회해 메웁니다.
2585
2585
  * @summary 웹훅 구독 등록
2586
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2586
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2587
2587
  * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
2588
2588
  * @param {*} [options] Override http request option.
2589
2589
  * @throws {RequiredError}
@@ -2592,11 +2592,11 @@ class PartnerApiApi extends base_1.BaseAPI {
2592
2592
  return (0, exports.PartnerApiApiFp)(this.configuration).createWebhookEndpoint(idempotencyKey, createWebhookEndpointRequestDto, options).then((request) => request(this.axios, this.basePath));
2593
2593
  }
2594
2594
  /**
2595
- * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH {\"status\":\"DISABLED\"}` 쓰세요 시크릿과 이벤트 구성이 남아 그대로 되살릴 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2595
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 되돌릴없습니다. 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. 잠시만 멈추려면 `PATCH`로 `{\"status\":\"DISABLED\"}`를 보내세요. - `If-Match`가 필수입니다. 누락은 428, 그 사이 구독이 바뀌었으면 412입니다.
2596
2596
  * @summary 웹훅 구독 삭제
2597
2597
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2598
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2599
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2598
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
2599
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2600
2600
  * @param {*} [options] Override http request option.
2601
2601
  * @throws {RequiredError}
2602
2602
  */
@@ -2604,9 +2604,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2604
2604
  return (0, exports.PartnerApiApiFp)(this.configuration).deleteWebhookEndpoint(endpointId, ifMatch, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2605
2605
  }
2606
2606
  /**
2607
- * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`URL 을 가리킨다. 요청 시점에 서명하므로 URL 을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}` 파일 메타와 `downloadUrl` v2 응답 규약으로 돌려줍니다. 이 안정 URL 은 파트너 응답의 `fileUrl`/`fullUrl` 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
2607
+ * 무인증 — `fileKey` 자체가 capability 다(키를 아는 쪽이 곧 접근 권한을 가진다). 파트너 응답의 `fileUrl`/`fullUrl`이 이 URL을 가리킨다. 요청 시점에 서명하므로 URL을 저장해 두어도 만료되지 않는다. 응답은 실제 저장소 URL 로의 302 리다이렉트이며 리다이렉트 타깃은 1시간 뒤 만료되므로 302 자체를 캐시하지 말 것(`Cache-Control: no-store`). --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 이미 있습니다 — `GET /v2/files/{fileKey}`가 파일 메타와 `downloadUrl`을 v2 응답 규약으로 돌려줍니다. 이 안정 URL은 파트너 응답의 `fileUrl`/`fullUrl`이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
2608
2608
  * @summary 파일 다운로드
2609
- * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다.
2609
+ * @param {string} fileKey 파일 키 — 영문 대소문자·숫자 32자. 업로드(&#x60;POST /v1|/v2/files&#x60;) 응답에서 받은 값. 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다.
2610
2610
  * @param {*} [options] Override http request option.
2611
2611
  * @throws {RequiredError}
2612
2612
  */
@@ -2614,10 +2614,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2614
2614
  return (0, exports.PartnerApiApiFp)(this.configuration).downloadFile(fileKey, options).then((request) => request(this.axios, this.basePath));
2615
2615
  }
2616
2616
  /**
2617
- * 공고의 모든 정보를 번에 조회합니다 — 기본 정보·납품/대금 조건·담당자·품목, 응찰 참여자(투찰가·순위·낙찰 여부), 계약서류, 검수 진행 상태, 라이프사이클 하위 상태. 스코프 `bids:read`. ERP 는 이 엔드포인트를 폴링해 async 처리(정산 마감 등)의 성사를 관측합니다. **낙찰 여부:** 응답의 `status` 아니라 `participants[].isWinner` 관측합니다. AWARDED 라는 공고 상태는 존재하지 않으며(낙찰 직후 공고는 CONTRACT_IN_PROGRESS 로 전이) `status === \'AWARDED\'` 기다리면 영원히 도달하지 않습니다. **여러 건을 한 번에:** 공고마다 이 조회를 반복하지 말고 `GET /v2/bid-results` 배치 조회를 쓰세요. **계약서류는 이 응답에 실립니다.** `contractDocuments[]` 서류별 `paperCode`·`paperName`· `fileKey`·`downloadUrl`·`uploadedAt`·`winnerSequence` 를 담습니다 — 계약서류만 따로 받는 엔드포인트는 두지 않습니다. `generationState` **관측 전용**이며 `DEAD_LETTER` 보이면 자동 재시도가 소진된 상태라 API 되살릴 수 없습니다(운영에 문의하세요). **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
2617
+ * 공고 건의 전체 정보를 조회합니다 — 기본 정보, 납품·대금 조건, 담당자, 품목, 응찰 참여자, 계약서류, 검수 상태. 스코프 `bids:read`. - 낙찰 여부는 `status`가 아니라 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없어(낙찰 직후 `CONTRACT_IN_PROGRESS`) `status === \'AWARDED\'` 폴링은 끝나지 않습니다. - 계약서류는 `contractDocuments[]`에 실립니다. 따로 받는 엔드포인트는 없습니다. - 여러 건은 `GET /v2/bid-results`로 번에 받습니다. - 다른 발주기관의 공고는 403입니다.
2618
2618
  * @summary 공고 상세 조회
2619
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2620
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2619
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2620
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2621
2621
  * @param {*} [options] Override http request option.
2622
2622
  * @throws {RequiredError}
2623
2623
  */
@@ -2625,10 +2625,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2625
2625
  return (0, exports.PartnerApiApiFp)(this.configuration).getBid(bidRef, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2626
2626
  }
2627
2627
  /**
2628
- * 낙찰 공급사의 사업자·계좌·공급가액/부가세·응찰 품목내역을 조회합니다. 대금 지급에 필요한 정보입니다. 다른 조회에서 일부 참가자 정보가 가려지는 경우와 무관하게, 이 정산 정보는 읽기 전용으로 항상 그대로 제공됩니다. **필수 스코프:** `invoices:read` — 종전에는 `bids:read` 요구했습니다. 대금·계좌가 실리는 응답이라 공고 조회 권한과 분리했습니다. 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
2628
+ * 낙찰 공급사의 사업자·계좌 정보와 공급가액·부가세, 응찰 품목내역을 조회합니다. 대금 지급에 필요한 값입니다. 스코프 `invoices:read`(종전 `bids:read`에서 변경). 다른 조회에서 참가자 정보가 가려지는 경우와 무관하게응답은 항상 그대로 나갑니다.
2629
2629
  * @summary 정산 정보 조회
2630
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2631
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2630
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2631
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2632
2632
  * @param {*} [options] Override http request option.
2633
2633
  * @throws {RequiredError}
2634
2634
  */
@@ -2636,11 +2636,11 @@ class PartnerApiApi extends base_1.BaseAPI {
2636
2636
  return (0, exports.PartnerApiApiFp)(this.configuration).getBidSettlement(bidRef, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2637
2637
  }
2638
2638
  /**
2639
- * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. **필수 스코프:** `invoices:read` — 종전에는 `contracts:read` 를 요구했습니다. 금액이 실리는 정산 계열 문서라 계약서류 조회 권한과 분리했습니다. 이 엔드포인트를 쓰시던 키에는 `invoices:read` 를 추가로 부여받으셔야 합니다.
2639
+ * 낙찰 계약의 거래명세서(문서 헤더와 품목 라인)를 조회합니다. 스코프 `invoices:read`(종전 `contracts:read`에서 변경).
2640
2640
  * @summary 거래명세서 조회
2641
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2641
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2642
2642
  * @param {number} [paperCode] 거래명세서 서식 코드. 생략하면 해당 공고에 적용된 기본 서식으로 조회합니다. 기관에 서식이 여러 벌인 경우에만 지정하세요.
2643
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2643
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2644
2644
  * @param {*} [options] Override http request option.
2645
2645
  * @throws {RequiredError}
2646
2646
  */
@@ -2648,10 +2648,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2648
2648
  return (0, exports.PartnerApiApiFp)(this.configuration).getBidStatement(bidRef, paperCode, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2649
2649
  }
2650
2650
  /**
2651
- * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey` 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName` 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex 가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
2651
+ * 파일명·크기·업로드 시각과 내려받기 주소를 함께 조회합니다. **내려받기:** 응답의 `downloadUrl` 로 파일을 받으세요. 요청 시점에 서명하므로 유효기간이 있습니다 — 저장해 두고 재사용하지 마시고 필요할 때 이 조회를 다시 호출하세요. **대부분은 이 조회가 필요 없습니다.** 공고·결과 응답의 첨부 항목에 파일명과 내려받기 주소 (`fileUrl`/`fullUrl`, 만료 없는 안정 주소)가 이미 실려 있습니다. 이 엔드포인트는 그 주소를 들고 있지 않고 `fileKey`만 아는 경우(예: 업로드 직후 크기 확인)를 위한 것입니다. **MIME 타입은 싣지 않습니다.** 저장소가 그 값을 신뢰할 수 있게 보관하지 않아서, 지어내면 그것으로 분기한 쪽이 조용히 틀립니다. 확장자는 `fileName`에 그대로 들어 있습니다. **형식이 틀린 키는 404 가 아니라 400 입니다.** fileKey 는 **영문 대소문자·숫자 32자**이고, 그 형태가 아닌 값은 애초에 키가 될 수 없으므로 그렇게 답합니다. 형식은 맞지만 없는 키는 404 입니다. 키를 16진수(hex)로 가정해 클라이언트에서 걸러내지 마세요 — 업로드된 파일의 키에는 hex가 아닌 문자가 들어갑니다. **필수 스코프:** `files:read`
2652
2652
  * @summary 파일 정보 조회
2653
2653
  * @param {string} fileKey 파일 키 — 업로드 응답의 fileKey(영문 대소문자·숫자 32자).
2654
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2654
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2655
2655
  * @param {*} [options] Override http request option.
2656
2656
  * @throws {RequiredError}
2657
2657
  */
@@ -2669,10 +2669,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2669
2669
  return (0, exports.PartnerApiApiFp)(this.configuration).getSemoContractTaxinvoiceStatus(externalContractId, options).then((request) => request(this.axios, this.basePath));
2670
2670
  }
2671
2671
  /**
2672
- * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write` 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
2672
+ * 계약업체가 카드결제로 대금을 받을 수 있는 상태인지 확인합니다(씨마켓 회원 + 카드결제 가맹). **결제수단을 사용자에게 보여주기 전에** 호출하세요. 불가한 업체로 결제창을 만들면 만들어지기는 하지만 결제가 막혀, 사용자가 막다른 길에 갇힙니다. **응답은 가부와 사유뿐입니다.** 업체의 상호·사업자번호 같은 식별정보는 싣지 않습니다. **필수 스코프:** `payments:read` — 구 경로(`/v2/card-payment-requests/suppliers/{id}/card-payable`)는 조회인데도 `payments:write`를 요구했습니다. 그쪽은 동결 표면이라 그대로 둡니다.
2673
2673
  * @summary 공급사 카드결제 가능 여부
2674
2674
  * @param {string} memberId 계약업체 회원 ID
2675
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2675
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2676
2676
  * @param {*} [options] Override http request option.
2677
2677
  * @throws {RequiredError}
2678
2678
  */
@@ -2680,10 +2680,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2680
2680
  return (0, exports.PartnerApiApiFp)(this.configuration).getSupplierCardPayableV2(memberId, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2681
2681
  }
2682
2682
  /**
2683
- * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 `endpointId` 확인하세요. **필수 스코프:** `webhooks:read`
2683
+ * 구독 1건의 현재 상태를 조회합니다. 스코프 `webhooks:read`. 수정·삭제 전에 먼저 호출해 응답 헤더의 `ETag`를 `If-Match`에 실어야 합니다. 없는 구독이거나 다른 파트너 키의 구독이면 404입니다. 서명 시크릿은 실리지 않습니다.
2684
2684
  * @summary 웹훅 구독 단건 조회
2685
2685
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2686
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2686
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2687
2687
  * @param {*} [options] Override http request option.
2688
2688
  * @throws {RequiredError}
2689
2689
  */
@@ -2693,7 +2693,7 @@ class PartnerApiApi extends base_1.BaseAPI {
2693
2693
  /**
2694
2694
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
2695
2695
  * @summary Partner API 헬스체크
2696
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2696
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2697
2697
  * @param {*} [options] Override http request option.
2698
2698
  * @throws {RequiredError}
2699
2699
  */
@@ -2701,10 +2701,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2701
2701
  return (0, exports.PartnerApiApiFp)(this.configuration).healthControllerCheck(ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2702
2702
  }
2703
2703
  /**
2704
- * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. **이 엔드포인트를 폴링에 쓰세요.** 공고를 하나씩 조회하는 대신 최대 100건을 한 왕복으로 받습니다. 응답에 실린 `ETag` 다음 요청의 `If-None-Match` 되보내면, 결과가 그대로일 때 `304` 본문 없이 받습니다. **식별자 전달:** `?bidRefs=A,B,C`(쉼표) 또는 `?bidRefs=A&bidRefs=B`(반복) 둘 다 됩니다. **없는 공고는 응답에서 빠집니다.** 존재하지 않거나 대행 범위 밖인 식별자는 오류가 아니라 누락으로 처리됩니다. 요청한 건수와 받은 건수가 다를 수 있으므로, 보낸 값이 공고번호였다면 `bidId` 로, 구매번호였다면 `purchaseNo` 로 대조하세요. **공고 하나만 볼 때도** `bidRefs` 에 하나만 넣으면 됩니다. 응찰 결과 외에 납품 조건·품목·계약서류까지 필요하면 `GET /v2/bids/{bidRef}` 상세 조회를 쓰세요.
2704
+ * 여러 공고의 응찰 결과를 한 번에 조회합니다. 스코프 `bids:read`. - 결과 확인은 공고를 하나씩 조회하지 말고 이 엔드포인트로 최대 100건씩 받습니다. 응답의 `ETag`를 다음 요청의 `If-None-Match`로 보내면 변화가 없을본문 없이 `304`로 끝납니다. - 식별자는 `?bidRefs=A,B,C`와 `?bidRefs=A&bidRefs=B` 둘 다 됩니다. - 없거나 대행 범위 밖인 식별자는 오류가 아니라 응답에서 빠집니다. 보낸 값이 공고번호면 `bidId`, 구매번호면 `purchaseNo`로 대조합니다.
2705
2705
  * @summary 공고 결과 조회
2706
- * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60; 반복해 전달합니다. 최대 100건입니다.
2707
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2706
+ * @param {string} bidRefs 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. 쉼표로 구분하거나 &#x60;bidRefs&#x60;를 반복해 전달합니다. 최대 100건입니다.
2707
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2708
2708
  * @param {*} [options] Override http request option.
2709
2709
  * @throws {RequiredError}
2710
2710
  */
@@ -2712,14 +2712,14 @@ class PartnerApiApi extends base_1.BaseAPI {
2712
2712
  return (0, exports.PartnerApiApiFp)(this.configuration).listBidResults(bidRefs, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2713
2713
  }
2714
2714
  /**
2715
- * 발주처(API 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 다음 요청 `cursor` 전달하면 다음 페이지를 받습니다. `meta.hasMore` `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 관측합니다(AWARDED 상태는 없습니다).
2715
+ * API 키에 연결된 발주기관의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. - 발주기관은 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 페이지네이션: `limit`(1~100, 기본 100) `cursor`. 응답 `meta.nextCursor`를 다음 요청의 `cursor`로 보내고, `meta.hasMore`가 `false`면 마지막 페이지입니다. - 낙찰 여부는 공고 상태가 아니라 `GET /v2/bid-results`의 `participants[].isWinner`로 판단합니다. `AWARDED` 상태는 없습니다.
2716
2716
  * @summary 공고 목록 조회
2717
2717
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
2718
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달한다. 미지정 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
2719
- * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV 로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
2718
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 보냅니다. 생략하면페이지이고, &#x60;nextCursor&#x60;가 &#x60;null&#x60;이면 마지막 페이지입니다.
2719
+ * @param {Array<string>} [bidRefs] 조회할 공고 식별자 목록. 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다. 두 형식을 섞어 보내도 됩니다. CSV로 전달하며 최대 100건. 지정 시 그 공고만 조회합니다.
2720
2720
  * @param {Array<BidPublicStatus>} [status] 공고 상태 필터(공개값) CSV. 지정 시 그중 하나라도 일치하는 공고만 조회합니다.
2721
2721
  * @param {Array<ListBidsIncludeEnum>} [include] 행별 확장 부착 CSV. &#x60;results&#x60;&#x3D;응찰 참여자, &#x60;products&#x60;&#x3D;공고 등록 품목, &#x60;contacts&#x60;&#x3D;발주 담당자 성명·연락처·이메일. 미지정이면 부착하지 않는다(응답이 가볍고 조회 비용도 들지 않는다).
2722
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2722
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2723
2723
  * @param {*} [options] Override http request option.
2724
2724
  * @throws {RequiredError}
2725
2725
  */
@@ -2727,7 +2727,7 @@ class PartnerApiApi extends base_1.BaseAPI {
2727
2727
  return (0, exports.PartnerApiApiFp)(this.configuration).listBids(limit, cursor, bidRefs, status, include, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2728
2728
  }
2729
2729
  /**
2730
- * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market 이 데이터를 채워 PDF 로 만들어 주는 서류입니다. 생성 API 의 `paperCodes` 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents` v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2730
+ * 발주기관 회원과 거래유형으로 **그 거래에 필요한 계약서류 목록**을 조회합니다. **용도:** 공고(입찰)를 거치지 않는 거래 — 예: 채팅 기반 견적 — 에서 계약 전에 \"어떤 서류가 필요한가\"를 보여줄 때. **판정 기준:** 발주기관이 속한 그룹에 배정된 계약서류 중 그 거래유형에 적용되는 것 전부입니다. 운영자가 어드민에서 배정을 바꾸면 별도 배포 없이 즉시 반영됩니다. **응답 해석:** - `isDefault=true` — 운영자가 기본값(★)으로 켜 둔 서류입니다. 선택 화면에서 **미리 체크된 상태로** 보여주세요. 목록이 이 값으로 걸러져 있지는 않습니다. - `autoGenerated=true` — c-market이 데이터를 채워 PDF로 만들어 주는 서류입니다. 생성 API의 `paperCodes`에 넣을 수 있습니다. - `autoGenerated=false` — 이 API 로는 만들 수 없는 서류입니다(거래명세서처럼 세금계산서 발행 같은 별도 시점이 필요한 서류). 목록에서 감추지 말고 사용자가 직접 첨부하도록 안내하세요. **조회 가능한 회원 범위:** 이 API 키에 설정된 대행 범위(소속 그룹 전원 또는 지정 회원 목록) 안의 회원만 조회할 수 있습니다. 범위 밖이면 403 입니다. 대행 범위는 키 설정이며 스코프와는 별개 축입니다. **필수 스코프:** `contracts:read` --- **응답 형태가 동결된 표면입니다.** 이미 연동 중인 시스템이 있어 응답 필드를 추가하거나 이름을 바꾸지 않습니다. 다른 `/v2` 엔드포인트와 달리 `{data,meta}` 봉투를 씌우지 않으므로 응답 본문이 곧 위 스키마입니다. 지금 연동하셔도 계속 동작합니다 — 다만 이 경로에 새 기능이 추가되지는 않습니다. **대체 계획:** 공고 기반 거래의 계약서류는 `GET /v2/bids/{bidRef}/contract-documents`가 v2 응답 규약으로 제공합니다. 공고 없는 거래(이 엔드포인트)의 신 표면은 아직 없습니다 — 만들 때 이 설명에 새 경로와 이관 기간을 함께 적습니다.
2731
2731
  * @summary 거래에 필요한 계약서류 목록 조회
2732
2732
  * @param {string} buyerId 발주기관 회원 ID(c-market memberId).
2733
2733
  * @param {ListExternalContractDocumentsBidTypeEnum} bidType 거래유형.
@@ -2738,13 +2738,13 @@ class PartnerApiApi extends base_1.BaseAPI {
2738
2738
  return (0, exports.PartnerApiApiFp)(this.configuration).listExternalContractDocuments(buyerId, bidType, options).then((request) => request(this.axios, this.basePath));
2739
2739
  }
2740
2740
  /**
2741
- * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 걸러 다시 처리하면 됩니다. - \"이벤트가 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 같고 `attempt` 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 다음 요청의 `cursor` 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
2741
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문, 수신측 응답 상태, 다음 재시도 시각이 함께 실립니다. 스코프 `webhooks:read`. - 수신측 장애로 놓친 이벤트는 `status=EXHAUSTED`로 걸러 다시 처리합니다. 웹훅의 폴링 대체 경로입니다. - 재시도마다 한 행이며 `eventId`가 같고 `attempt`만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단합니다. - 페이지네이션: 응답 `nextCursor`를 다음 요청의 `cursor`로 보냅니다. `null`이면 마지막 페이지입니다.
2742
2742
  * @summary 웹훅 전송 이력 조회
2743
2743
  * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
2744
2744
  * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
2745
2745
  * @param {number} [limit] 페이지 크기(1~200, 기본 50).
2746
- * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 그대로 전달합니다. 미지정 시 첫 페이지.
2747
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2746
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60;를 그대로 전달합니다. 미지정 시 첫 페이지.
2747
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2748
2748
  * @param {*} [options] Override http request option.
2749
2749
  * @throws {RequiredError}
2750
2750
  */
@@ -2752,9 +2752,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2752
2752
  return (0, exports.PartnerApiApiFp)(this.configuration).listWebhookDeliveries(endpointId, status, limit, cursor, ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2753
2753
  }
2754
2754
  /**
2755
- * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. **호출 시점:** 연동 상태를 점검할 때, 또는 발송이 멈춘 이유(`status`·`consecutiveFailures`)를 확인할 때. 서명 시크릿은 여기에 실리지 않습니다. **필수 스코프:** `webhooks:read` ### 서명 검증 (필수) 서명은 **[Standard Webhooks](https://www.standardwebhooks.com)** 규약을 그대로 따릅니다. 직접 구현하지 말고 각 언어의 `standardwebhooks` 라이브러리에 등록 시 받은 시크릿 (`whsec_…`)을 그대로 넘기세요 그것이 이 형식을 쓰는 이유입니다. ```java // Java Webhook webhook = new Webhook(secret); // secret = \"whsec_…\" webhook.verify(rawBody, headers); // 실패하면 예외 ``` ```ts // Node / TypeScript import { Webhook } from \'standardwebhooks\'; new Webhook(secret).verify(rawBody, headers); ``` 라이브러리를 쓸 수 없다면 발송 요청에 실리는 헤더는 셋입니다. ``` webhook-id: evt_01J8Z7Q3K9 webhook-timestamp: 1774915200 webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4= ``` 1. 시크릿에서 `whsec_` 접두어를 떼고 **base64 디코드**합니다 — 그 바이트가 HMAC 키입니다 (시크릿 문자열 자체가 아닙니다). 2. `\"${webhook-id}.${webhook-timestamp}.${본문 원문}\"` 을 만듭니다. **본문은 파싱 전 원문 바이트**여야 합니다 — JSON 을 다시 직렬화하면 공백·키 순서가 달라져 서명이 맞지 않습니다. 3. HMAC-SHA256 을 계산해 **base64** 로 인코딩하고, `webhook-signature` 의 `v1,` 뒤 값과 비교합니다. 비교는 **상수 시간** 함수를 쓰세요(Node `crypto.timingSafeEqual`, Java `MessageDigest.isEqual`). 4. `webhook-timestamp` 가 현재 시각에서 **5분** 이상 지났으면 거절하세요(재전송 공격 방어). `webhook-signature` 는 공백으로 구분된 **여러 서명**을 실을 수 있는 형식입니다(키 회전용). 지금은 항상 하나지만, 검증기는 목록으로 읽고 **하나라도 맞으면 통과**하도록 짜세요. ### 중복 제거 `webhook-id` 헤더가 이벤트 식별자입니다. **재시도에도 같은 값이 옵니다** — 이미 처리한 값이면 무시하세요. 같은 이벤트를 두 번 받는 것은 정상 동작이며, 중복 제거는 수신측 책임입니다. 편의를 위해 `webhook-event-type` 헤더에 이벤트 타입(본문 `type` 과 같은 값)도 실립니다 — 본문을 파싱하기 전에 관심 없는 타입을 버릴 수 있습니다. 표준에는 없는 확장이라 검증 라이브러리는 이 헤더를 무시합니다. ### 응답과 재시도 2xx 를 돌려주면 성공입니다. 그 외(또는 무응답)는 실패로 보고 최대 7회 재시도합니다 — 간격은 10초 → 1분 → 5분 → 30분 → 2시간 → 6시간 → 24시간 입니다. 처리 시간이 길면 먼저 2xx 를 돌려주고 비동기로 처리하세요. 연속 실패가 20회에 닿으면 구독이 자동으로 `DISABLED` 로 내려가고 발송이 멈춥니다. 수신측을 고친 뒤 `PATCH /v2/webhook-endpoints/{endpointId}` `{\"status\":\"ACTIVE\"}` 로 되살리세요. ### 구독 가능한 이벤트 `bid.closed` · `bid.awarded` · `bid.failed` · `bid.canceled` · `bid.award_reverted` `ping` 은 연결 확인 전용이라 구독할 수 없습니다 — 테스트 발송 경로에서만 나갑니다. ### 놓친 이벤트 확인 `GET /v2/webhook-deliveries` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2755
+ * 이 API 키가 등록한 웹훅 구독을 모두 조회합니다. 스코프 `webhooks:read`. 발송이 멈춘 이유는 `status`와 `consecutiveFailures`로 확인합니다. 서명 시크릿은 실리지 않습니다. 수신측 구현 방법은 `POST /v2/webhook-endpoints` 설명에 있습니다.
2756
2756
  * @summary 웹훅 구독 목록 조회
2757
- * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60; 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2757
+ * @param {string} [ifNoneMatch] 직전 응답의 &#x60;ETag&#x60; 값. 내용이 그대로면 본문 없이 &#x60;304&#x60;로 끝납니다 — 폴링에서 전송량과 파싱 비용이 사라집니다.
2758
2758
  * @param {*} [options] Override http request option.
2759
2759
  * @throws {RequiredError}
2760
2760
  */
@@ -2762,10 +2762,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2762
2762
  return (0, exports.PartnerApiApiFp)(this.configuration).listWebhookEndpoints(ifNoneMatch, options).then((request) => request(this.axios, this.basePath));
2763
2763
  }
2764
2764
  /**
2765
- * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(FAILED)로 전환됩니다. - 유찰사유 코드와 상세가 기록됩니다. **유찰사유 값 목록(failureReasonCode 공개값):** | | 의미 | |------|------| | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `OTHER` | 기타 (`failureReasonDetail` 필수) | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2765
+ * 공고를 유찰 처리합니다. 입찰 마감 상태에서 호출합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. 공고 상태가 유찰(`FAILED`)로 바뀌고 유찰사유가 기록됩니다. 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). | `failureReasonCode` | 의미 | | --- | --- | | `ABOVE_TARGET_PRICE` | 예정가격 초과 | | `DEPT_MISMATCH` | 자격 미달 | | `NEEDS_EXPERTISE` | 전문성 필요 | | `NO_PARTICIPANT` | 참가자 없음 | | `SINGLE_PARTICIPANT` | 단독 참가 | | `LESS_THAN_TWO` | 2인 미만 | | `BELOW_MINIMUM` | 최저가 미달 | | `OTHER` | 기타(`failureReasonDetail` 필수) |
2766
2766
  * @summary 유찰 처리
2767
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2768
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2767
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2768
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2769
2769
  * @param {MarkBidFailedRequestDto} markBidFailedRequestDto
2770
2770
  * @param {*} [options] Override http request option.
2771
2771
  * @throws {RequiredError}
@@ -2774,10 +2774,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2774
2774
  return (0, exports.PartnerApiApiFp)(this.configuration).markBidFailed(bidRef, idempotencyKey, markBidFailedRequestDto, options).then((request) => request(this.axios, this.basePath));
2775
2775
  }
2776
2776
  /**
2777
- * 낙찰 결과를 등록합니다. 요청의 응답은 처리 상태 `AWARDED` 반환합니다. **호출 시점:** 입찰 마감 후 낙찰자가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 낙찰자(공급사)의 응찰 건이 낙찰 처리됩니다. - 이후 **공고의 조회 상태(status)는 계약진행(CONTRACT_IN_PROGRESS)** 으로 진행합니다. `AWARDED` 라는 공고 status 존재하지 않으므로, 낙찰 여부는 `GET /v2/bids/{bidRef}/results` 의 `participants[].isWinner` 또는 `GET /v2/bids/{bidRef}` 의 status(=계약진행)로 관측하세요(`status === \'AWARDED\'` 폴링 금지). - 협상 방식(NEGOTIATION/NEGOTIATION_AUTO) 공고는 이 엔드포인트 전에 `POST /v2/bids/{bidRef}/negotiation-scores`(협상 점수평가)로 평가를 완료해야 합니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 24시간 캐시 응답 반환.
2777
+ * 낙찰 결과를 등록합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감(입찰완료) 상태에서 호출합니다. - 낙찰 공고 상태는 계약진행(`CONTRACT_IN_PROGRESS`)입니다. `AWARDED` 공고 상태는 없으므로 낙찰 여부는 `participants[].isWinner`로 판단합니다. - 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고는 `POST /v2/bids/{bidRef}/negotiation-scores`로 평가를 마쳐야 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다). - 같은 키와 같은 body 재전송하면 24시간 동안 캐시된 응답을 돌려줍니다.
2778
2778
  * @summary 낙찰 결과 전송
2779
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2780
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2779
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2780
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2781
2781
  * @param {RegisterAwardRequestDto} registerAwardRequestDto
2782
2782
  * @param {*} [options] Override http request option.
2783
2783
  * @throws {RequiredError}
@@ -2786,9 +2786,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2786
2786
  return (0, exports.PartnerApiApiFp)(this.configuration).registerAward(bidRef, idempotencyKey, registerAwardRequestDto, options).then((request) => request(this.axios, this.basePath));
2787
2787
  }
2788
2788
  /**
2789
- * 입찰 정보 등록. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. **첨부는 2단계입니다.** 파일을 요청 본문에 직접 싣지 마세요 먼저 `POST /v2/files`(base64 또는 url)로 올려 `fileKey` 받고, 32자 키를 요청의 `attachments` 배열에 넣습니다.
2789
+ * 공고를 등록합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. 첨부는 방법 하나입니다. - `attachments` 원소에 `{ fileName, url }` 또는 `{ fileName, base64 }`를 그대로 넣습니다. - 여러 공고에서 재사용할 파일은 `POST /v2/files`로 먼저 올려 받은 `fileKey`를 넣습니다.
2790
2790
  * @summary 공고 등록
2791
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2791
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2792
2792
  * @param {CreateBidRequestDto} createBidRequestDto
2793
2793
  * @param {*} [options] Override http request option.
2794
2794
  * @throws {RequiredError}
@@ -2799,7 +2799,7 @@ class PartnerApiApi extends base_1.BaseAPI {
2799
2799
  /**
2800
2800
  * 외부에서 맺어진 계약 1건을 씨마켓의 **세금계산서 발행 대상**으로 등록합니다. **등록 후 동선:** 발주기관이 씨마켓 [나의 계약 관리] 에서 계산서 발급을 요청하고, 공급기업이 같은 화면에서 발행합니다. 계산서의 **공급자는 공급기업, 공급받는자는 발주기관**입니다. **대금 흐름:** 씨마켓은 이 거래의 대금을 받지 않습니다 — 발행 경로만 제공합니다. **금액:** `supplyPrice` 는 **부가세를 뺀 과세 공급가액**입니다(결제창 API 가 부가세 포함가를 받는 것과 다릅니다). 과세·면세 공급가액이 모두 0 이면 400 입니다. **사전 조건:** 두 회원 ID 가 씨마켓에 실재해야 합니다. 회원 ID 가 곧 소유권이라, 없는 회원으로 등록하면 아무도 열 수 없는 계산서 대상이 됩니다. **필수 스코프:** `contracts:write`. 바인딩된 발주처 외의 발주기관을 대신하려면 대행 범위에 그 회원이 있어야 합니다. **멱등성:** `externalContractId` 가 멱등키입니다. 같은 값으로 재요청하면 새로 만들지 않고 기존 대상을 돌려줍니다(`reused=true`). `Idempotency-Key` 헤더도 함께 사용하세요.
2801
2801
  * @summary 계약 발행대상 등록
2802
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2802
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2803
2803
  * @param {RegisterSemoContractRequestDto} registerSemoContractRequestDto
2804
2804
  * @param {*} [options] Override http request option.
2805
2805
  * @throws {RequiredError}
@@ -2808,10 +2808,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2808
2808
  return (0, exports.PartnerApiApiFp)(this.configuration).registerSemoContract(idempotencyKey, registerSemoContractRequestDto, options).then((request) => request(this.axios, this.basePath));
2809
2809
  }
2810
2810
  /**
2811
- * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write`. **청구만 접수합니다.** 호출이 계산서를 발행하지는 않습니다 접수된 청구는 정산 파이프라인이 처리하며, 진행 여부는 `GET /v2/bids/{bidRef}` `taxInvoiceRequested` 관측합니다. **나눠 담을 금액을 보냅니다.** `supplyAmount`(공급가액)와 `vat`(부가세)는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 같은 공고에 청구를 한 번 더 보냅니다 — 그때는 **새 `Idempotency-Key`** 쓰세요. 같은 키로 다시 보내면 앞선 청구의 응답이 그대로 재생됩니다. **발급 희망일**(`issueDate`)은 선택이며 미래 일자는 400 입니다. 미지정 시 서버 기본값을 씁니다.
2811
+ * 한 공고의 계산서를 여러 장으로 나눠 발급해 달라고 청구합니다. 스코프 `invoices:write` · `Idempotency-Key` 헤더 필수. - 청구만 접수합니다. 발행은 정산 파이프라인이 처리하며 진행 여부는 `GET /v2/bids/{bidRef}`의 `taxInvoiceRequested`로 확인합니다. - `supplyAmount`와 `vat`는 이번 장에 실을 금액입니다. 남은 금액을 다시 나누려면 **새 `Idempotency-Key`**로 청구합니다. 같은 키는 앞선 청구의 응답을 그대로 돌려줍니다. - `issueDate`는 선택이며 미래 일자는 400입니다.
2812
2812
  * @summary 계산서 분할 발급 청구
2813
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2814
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2813
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2814
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2815
2815
  * @param {RequestInvoiceSplitRequestDto} requestInvoiceSplitRequestDto
2816
2816
  * @param {*} [options] Override http request option.
2817
2817
  * @throws {RequiredError}
@@ -2822,8 +2822,8 @@ class PartnerApiApi extends base_1.BaseAPI {
2822
2822
  /**
2823
2823
  * 확정된 낙찰을 되돌려 공고를 낙찰대기(PENDING_AWARD) 상태로 보냅니다. 스코프 `awards:write` + `Idempotency-Key` 헤더 필수. **호출 시점:** 낙찰자가 계약을 포기했거나 낙찰 처리 자체가 잘못됐을 때. 되돌린 뒤 같은 공고에 다시 낙찰을 등록할 수 있습니다. **되돌릴 수 없는 경우 → 409:** - 수수료 결제가 이미 완료된 공고 - 세금계산서가 이미 발행된 공고 - 수입권공매 계열 낙찰방법(다수 낙찰자 구조라 되돌리기 단위가 다릅니다) **사유는 필수입니다** — 감사 대상 행위이며 공고 이력에 남습니다. **소유권:** 요청 파트너 키가 소유한 발주처 공고여야 합니다(타 발주처 공고 → 403).
2824
2824
  * @summary 낙찰 되돌리기
2825
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2826
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2825
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2826
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2827
2827
  * @param {RevertAwardRequestDto} revertAwardRequestDto
2828
2828
  * @param {*} [options] Override http request option.
2829
2829
  * @throws {RequiredError}
@@ -2832,10 +2832,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2832
2832
  return (0, exports.PartnerApiApiFp)(this.configuration).revertAward(bidRef, idempotencyKey, revertAwardRequestDto, options).then((request) => request(this.axios, this.basePath));
2833
2833
  }
2834
2834
  /**
2835
- * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
2835
+ * 서명 시크릿을 새로 발급합니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 시크릿은 이 응답에서 한 번만 나가고 `secretVersion`이 1 올라갑니다. - **옛 시크릿은 즉시 무효입니다.** 유예가 없으므로 순서를 지키세요 — ① 수신측이 옛 값과 새 값을 모두 받아들이도록 배포 → ② 이 호출 → ③ 새 반영 → ④ 옛 값 제거. - 같은 `Idempotency-Key`로 다시 부르면 새로 발급하지 않고 처음 발급한 값을 돌려줍니다(24시간).
2836
2836
  * @summary 웹훅 서명 시크릿 재발급
2837
2837
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2838
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2838
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2839
2839
  * @param {*} [options] Override http request option.
2840
2840
  * @throws {RequiredError}
2841
2841
  */
@@ -2843,10 +2843,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2843
2843
  return (0, exports.PartnerApiApiFp)(this.configuration).rotateWebhookSecret(endpointId, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2844
2844
  }
2845
2845
  /**
2846
- * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` `delivered: false` 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
2846
+ * 등록된 주소로 `ping` 이벤트를 1회 보내고 결과를 돌려줍니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - 수신측이 받지 못해도 응답은 200이고 `delivered: false`입니다. 원인은 `responseStatus`와 `error`로 좁힙니다. - 실제 이벤트와 같은 서명 헤더가 실리므로 검증 코드를 그대로 시험할 수 있습니다. - 다시 보내려면 `Idempotency-Key`를 쓰세요. 같은 키는 24시간 동안 직전 결과를 돌려줍니다.
2847
2847
  * @summary 웹훅 연결 확인 발송
2848
2848
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2849
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2849
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2850
2850
  * @param {*} [options] Override http request option.
2851
2851
  * @throws {RequiredError}
2852
2852
  */
@@ -2854,10 +2854,10 @@ class PartnerApiApi extends base_1.BaseAPI {
2854
2854
  return (0, exports.PartnerApiApiFp)(this.configuration).sendWebhookTestEvent(endpointId, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2855
2855
  }
2856
2856
  /**
2857
- * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
2857
+ * 협상 방식(`NEGOTIATION`, `NEGOTIATION_AUTO`) 공고의 응찰자별 점수를 입력합니다. 스코프 `awards:write` · `Idempotency-Key` 헤더 필수. - 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전에 호출합니다. 협상 방식 공고는 이 평가를 마쳐야 낙찰에 진입합니다. - `complete=true`면 평가완료로 처리되어 낙찰을 호출할 있습니다. - 발주기관은 API 키로 결정됩니다(`buyerId`를 보내지 않습니다).
2858
2858
  * @summary 협상 점수평가
2859
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2860
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2859
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2860
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2861
2861
  * @param {SubmitNegotiationScoresRequestDto} submitNegotiationScoresRequestDto
2862
2862
  * @param {*} [options] Override http request option.
2863
2863
  * @throws {RequiredError}
@@ -2866,11 +2866,11 @@ class PartnerApiApi extends base_1.BaseAPI {
2866
2866
  return (0, exports.PartnerApiApiFp)(this.configuration).submitNegotiationScores(bidRef, idempotencyKey, submitNegotiationScoresRequestDto, options).then((request) => request(this.axios, this.basePath));
2867
2867
  }
2868
2868
  /**
2869
- * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` + `Idempotency-Key` 헤더 필수. 진행중/초안 상태의 공고만 수정할 수 있습니다. **부수효과:** - 변경 내용이 반영되고 수정이력이 기록됩니다. - `hideEditHistory=true` 면 변경이력을 비공개 처리하고 노출 카운터 증가를 생략합니다. **수정 제약:** - 낙찰방법(awardMethod)은 수정 불가(잠금). - 참여자가 있으면 입찰방식/면허/예산/품목 일부가 잠깁니다. - 마감/취소된 공고는 수정할 수 없습니다. 한 섹션을 수정하려면 해당 섹션의 필수 필드를 함께 보내야 합니다(부분 섹션은 거부됨).
2869
+ * 등록된 공고의 내용을 수정합니다. 스코프 `bids:write` · `Idempotency-Key` 헤더 필수. - 진행중·초안 상태만 수정할 수 있습니다. 마감·취소된 공고는 거부됩니다. - 낙찰방법(`awardMethod`)은 수정할 없고, 참여자가 있으면 입찰방식·면허·예산·품목 일부가 잠깁니다. - 한 섹션을 수정하려면 섹션의 필수 필드를 함께 보냅니다. - `hideEditHistory=true`면 변경이력을 비공개로 남기고 노출 카운터를 올리지 않습니다.
2870
2870
  * @summary 공고 수정
2871
- * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 바인딩된 발주처 범위에서 최신 라운드 공고로 해소됩니다.
2872
- * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412 로 거절되며 아무것도 수정되지 않습니다.
2873
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2871
+ * @param {string} bidRef 발주기관 자체 구매번호(권장) 또는 c-market 공고번호. 구매번호는 키에 연결된 발주기관 범위에서 최신 라운드 공고로 해소됩니다.
2872
+ * @param {string} ifMatch 수정하려는 공고의 ETag(필수). 직전 &#x60;GET /v2/bids/{bidRef}&#x60; 응답의 &#x60;ETag&#x60; 헤더 값을 그대로 실어 보내세요. 누락하면 428, 그 사이 공고가 바뀌었으면 412로 거절되며 아무것도 수정되지 않습니다.
2873
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2874
2874
  * @param {UpdateBidRequestDto} updateBidRequestDto
2875
2875
  * @param {*} [options] Override http request option.
2876
2876
  * @throws {RequiredError}
@@ -2879,11 +2879,11 @@ class PartnerApiApi extends base_1.BaseAPI {
2879
2879
  return (0, exports.PartnerApiApiFp)(this.configuration).updateBid(bidRef, ifMatch, idempotencyKey, updateBidRequestDto, options).then((request) => request(this.axios, this.basePath));
2880
2880
  }
2881
2881
  /**
2882
- * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 헤더가 없으면 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` 헤더를 빼먹었습니다. 조회 `ETag` 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2882
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. 스코프 `webhooks:write` · `Idempotency-Key` 헤더 필수. - `eventTypes`는 치환입니다. 하나를 더하려면 기존 목록을 포함한 전체를 보냅니다. - `If-Match`가 필수입니다. `GET`으로 받은 `ETag`를 그대로 실으세요. 누락은 428, 사이 구독이 바뀌었으면 412이며 아무것도 수정되지 않습니다. - 연속 실패로 자동 중지된 구독은 `{\"status\":\"ACTIVE\"}`로 되살립니다. - 시크릿은 이 경로로 바뀌지 않습니다. 재발급은 `rotate-secret`입니다.
2883
2883
  * @summary 웹훅 구독 수정
2884
2884
  * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2885
- * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2886
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2885
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412로 거절되며 아무것도 변경되지 않습니다.
2886
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2887
2887
  * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
2888
2888
  * @param {*} [options] Override http request option.
2889
2889
  * @throws {RequiredError}
@@ -2892,9 +2892,9 @@ class PartnerApiApi extends base_1.BaseAPI {
2892
2892
  return (0, exports.PartnerApiApiFp)(this.configuration).updateWebhookEndpoint(endpointId, ifMatch, idempotencyKey, updateWebhookEndpointRequestDto, options).then((request) => request(this.axios, this.basePath));
2893
2893
  }
2894
2894
  /**
2895
- * **첨부 업로드의 기본 경로입니다. 23MB 이하면 호출 하나로 끝납니다.** 파일 본문을 `base64` 또는 `url` 중 정확히 하나로 제출하면 `fileKey` 를 돌려줍니다. 이 값을 공고 등록·수정의 첨부 필드에 실으세요. **23MB 를 넘으면 경로를 바꿔야 합니다.** 상한이 셋으로 갈립니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | **23MB** (본문이 c-market 을 통과하며 base64 팽창 4/3 이 얹힘) | 1 | | 이 호출 + `url` | **30MB** (c-market 이 대신 내려받아 팽창은 없지만 서버 경유 천장은 그대로) | 1 | | `POST /v2/files/upload-url` 로 시작하는 2단계 | **100MB** (바이트가 c-market 을 지나지 않음) | 2 + 스토리지 PUT | c-market 내려받을 있는 https 주소에 파일을 올려 둘 수 있다면 `url` 이 30MB 까지를 1콜로 덮습니다. 그 이상이거나 주소를 열 수 없으면 2단계 경로를 쓰세요. **공고 등록에 파일을 함께 실을 수도 있습니다.** `POST /v2/bids` `attachments` 원소에 `{ fileName, url }`·`{ fileName, base64 }` 그대로 넣으면 호출 없이 번에 끝납니다. 여러 공고에 같은 파일을 재사용하거나 큰 파일을 다룰 때만 `fileKey` 를 먼저 만드세요. **필수 스코프:** `files:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2895
+ * 공고 첨부파일을 올리고 `fileKey`를 받습니다. 스코프 `files:write` · `Idempotency-Key` 헤더 필수. `base64`와 `url` 중 하나만 보냅니다. 받은 `fileKey`는 공고 등록·수정의 `attachments`에 넣습니다. | 제출 방식 | 상한 | 호출 수 | | --- | --- | --- | | 이 호출 + `base64` | 23MB | 1 | | 이 호출 + `url` | 30MB | 1 | | `POST /v2/files/upload-url` 2단계 | 100MB | 2 + 스토리지 PUT | 공고에만 쓰는 파일이면 `POST /v2/bids`의 `attachments`에 `url`·`base64`를 직접 넣어호출을 생략할 있습니다.
2896
2896
  * @summary 공고 첨부파일 업로드 (기본)
2897
- * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;) 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2897
+ * @param {string} idempotencyKey 멱등키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때는 처음과 같은 키를 보내야** 중복 생성이 막힙니다. 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청이 됩니다. UUID v4를 만들어 연동 시스템에 저장하거나, 요청 내용에서 결정적으로 파생하세요(예: &#x60;bid-create-{구매번호}&#x60;). 같은 키와 같은 body는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2898
2898
  * @param {UploadFileRequestDto} uploadFileRequestDto
2899
2899
  * @param {*} [options] Override http request option.
2900
2900
  * @throws {RequiredError}