@cmarket/partner-sdk 37.3.1 → 38.1.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 (799) hide show
  1. package/README.md +28 -5
  2. package/api/embed-api.ts +2 -2
  3. package/api/oauth-api.ts +2 -2
  4. package/api/partner-api-api.ts +688 -6
  5. package/api/products-api.ts +21 -13
  6. package/api/well-known-api.ts +2 -2
  7. package/api.ts +2 -2
  8. package/base.ts +2 -2
  9. package/common.ts +2 -2
  10. package/configuration.ts +2 -2
  11. package/dist/api/embed-api.d.ts +2 -2
  12. package/dist/api/embed-api.js +2 -2
  13. package/dist/api/oauth-api.d.ts +2 -2
  14. package/dist/api/oauth-api.js +2 -2
  15. package/dist/api/partner-api-api.d.ts +310 -6
  16. package/dist/api/partner-api-api.js +644 -6
  17. package/dist/api/products-api.d.ts +14 -10
  18. package/dist/api/products-api.js +20 -13
  19. package/dist/api/well-known-api.d.ts +2 -2
  20. package/dist/api/well-known-api.js +2 -2
  21. package/dist/api.d.ts +2 -2
  22. package/dist/api.js +2 -2
  23. package/dist/base.d.ts +2 -2
  24. package/dist/base.js +2 -2
  25. package/dist/common.d.ts +2 -2
  26. package/dist/common.js +2 -2
  27. package/dist/configuration.d.ts +2 -2
  28. package/dist/configuration.js +2 -2
  29. package/dist/esm/api/embed-api.d.ts +2 -2
  30. package/dist/esm/api/embed-api.js +2 -2
  31. package/dist/esm/api/oauth-api.d.ts +2 -2
  32. package/dist/esm/api/oauth-api.js +2 -2
  33. package/dist/esm/api/partner-api-api.d.ts +310 -6
  34. package/dist/esm/api/partner-api-api.js +644 -6
  35. package/dist/esm/api/products-api.d.ts +14 -10
  36. package/dist/esm/api/products-api.js +20 -13
  37. package/dist/esm/api/well-known-api.d.ts +2 -2
  38. package/dist/esm/api/well-known-api.js +2 -2
  39. package/dist/esm/api.d.ts +2 -2
  40. package/dist/esm/api.js +2 -2
  41. package/dist/esm/base.d.ts +2 -2
  42. package/dist/esm/base.js +2 -2
  43. package/dist/esm/common.d.ts +2 -2
  44. package/dist/esm/common.js +2 -2
  45. package/dist/esm/configuration.d.ts +2 -2
  46. package/dist/esm/configuration.js +2 -2
  47. package/dist/esm/index.d.ts +2 -2
  48. package/dist/esm/index.js +2 -2
  49. package/dist/esm/models/acceptance-result-response-dto.d.ts +2 -2
  50. package/dist/esm/models/acceptance-result-response-dto.js +2 -2
  51. package/dist/esm/models/acknowledge-product-receipt200-response.d.ts +2 -8
  52. package/dist/esm/models/acknowledge-product-receipt200-response.js +2 -2
  53. package/dist/esm/models/acknowledge-products-request-dto.d.ts +2 -2
  54. package/dist/esm/models/acknowledge-products-request-dto.js +2 -2
  55. package/dist/esm/models/api-catalog-dto.d.ts +2 -2
  56. package/dist/esm/models/api-catalog-dto.js +2 -2
  57. package/dist/esm/models/api-catalog-entry-dto.d.ts +2 -2
  58. package/dist/esm/models/api-catalog-entry-dto.js +2 -2
  59. package/dist/esm/models/api-catalog-link-dto.d.ts +2 -2
  60. package/dist/esm/models/api-catalog-link-dto.js +2 -2
  61. package/dist/esm/models/authorization-server-metadata-dto.d.ts +2 -2
  62. package/dist/esm/models/authorization-server-metadata-dto.js +2 -2
  63. package/dist/esm/models/award-method-public.d.ts +2 -2
  64. package/dist/esm/models/award-method-public.js +2 -2
  65. package/dist/esm/models/award-registered-v2-response-dto.d.ts +2 -2
  66. package/dist/esm/models/award-registered-v2-response-dto.js +2 -2
  67. package/dist/esm/models/award-reverted-v2-response-dto.d.ts +2 -2
  68. package/dist/esm/models/award-reverted-v2-response-dto.js +2 -2
  69. package/dist/esm/models/bid-acceptance-dto.d.ts +2 -2
  70. package/dist/esm/models/bid-acceptance-dto.js +2 -2
  71. package/dist/esm/models/bid-attachment-input-dto.d.ts +2 -2
  72. package/dist/esm/models/bid-attachment-input-dto.js +2 -2
  73. package/dist/esm/models/bid-bond-dto.d.ts +2 -2
  74. package/dist/esm/models/bid-bond-dto.js +2 -2
  75. package/dist/esm/models/bid-cancelled-response-dto.d.ts +2 -2
  76. package/dist/esm/models/bid-cancelled-response-dto.js +2 -2
  77. package/dist/esm/models/bid-contact-dto.d.ts +2 -2
  78. package/dist/esm/models/bid-contact-dto.js +2 -2
  79. package/dist/esm/models/bid-contacts-dto.d.ts +2 -2
  80. package/dist/esm/models/bid-contacts-dto.js +2 -2
  81. package/dist/esm/models/bid-contract-document-dto.d.ts +2 -2
  82. package/dist/esm/models/bid-contract-document-dto.js +2 -2
  83. package/dist/esm/models/bid-delivery-terms-dto.d.ts +2 -2
  84. package/dist/esm/models/bid-delivery-terms-dto.js +2 -2
  85. package/dist/esm/models/bid-detail-response-dto.d.ts +2 -2
  86. package/dist/esm/models/bid-detail-response-dto.js +2 -2
  87. package/dist/esm/models/bid-document-dto.d.ts +2 -2
  88. package/dist/esm/models/bid-document-dto.js +2 -2
  89. package/dist/esm/models/bid-failed-v2-response-dto.d.ts +2 -2
  90. package/dist/esm/models/bid-failed-v2-response-dto.js +2 -2
  91. package/dist/esm/models/bid-item-dto.d.ts +2 -2
  92. package/dist/esm/models/bid-item-dto.js +2 -2
  93. package/dist/esm/models/bid-lifecycle-dto.d.ts +2 -2
  94. package/dist/esm/models/bid-lifecycle-dto.js +2 -2
  95. package/dist/esm/models/bid-manager-dto.d.ts +2 -2
  96. package/dist/esm/models/bid-manager-dto.js +2 -2
  97. package/dist/esm/models/bid-payment-terms-dto.d.ts +2 -2
  98. package/dist/esm/models/bid-payment-terms-dto.js +2 -2
  99. package/dist/esm/models/bid-product-dto.d.ts +2 -2
  100. package/dist/esm/models/bid-product-dto.js +2 -2
  101. package/dist/esm/models/bid-public-status.d.ts +2 -2
  102. package/dist/esm/models/bid-public-status.js +2 -2
  103. package/dist/esm/models/bid-registered-response-dto.d.ts +2 -2
  104. package/dist/esm/models/bid-registered-response-dto.js +2 -2
  105. package/dist/esm/models/bid-result-participant-attachment-dto.d.ts +2 -2
  106. package/dist/esm/models/bid-result-participant-attachment-dto.js +2 -2
  107. package/dist/esm/models/bid-result-participant-dto.d.ts +2 -2
  108. package/dist/esm/models/bid-result-participant-dto.js +2 -2
  109. package/dist/esm/models/bid-results-response-dto.d.ts +2 -2
  110. package/dist/esm/models/bid-results-response-dto.js +2 -2
  111. package/dist/esm/models/bid-settlement-line-item-dto.d.ts +2 -2
  112. package/dist/esm/models/bid-settlement-line-item-dto.js +2 -2
  113. package/dist/esm/models/bid-settlement-participant-dto.d.ts +2 -2
  114. package/dist/esm/models/bid-settlement-participant-dto.js +2 -2
  115. package/dist/esm/models/bid-settlement-response-dto.d.ts +2 -2
  116. package/dist/esm/models/bid-settlement-response-dto.js +2 -2
  117. package/dist/esm/models/bid-statement-response-dto.d.ts +2 -2
  118. package/dist/esm/models/bid-statement-response-dto.js +2 -2
  119. package/dist/esm/models/bid-summary-dto.d.ts +2 -2
  120. package/dist/esm/models/bid-summary-dto.js +2 -2
  121. package/dist/esm/models/bid-type-public.d.ts +2 -2
  122. package/dist/esm/models/bid-type-public.js +2 -2
  123. package/dist/esm/models/bid-updated-response-dto.d.ts +2 -2
  124. package/dist/esm/models/bid-updated-response-dto.js +2 -2
  125. package/dist/esm/models/cancel-bid-request-dto.d.ts +2 -2
  126. package/dist/esm/models/cancel-bid-request-dto.js +2 -2
  127. package/dist/esm/models/cancel-bid200-response.d.ts +2 -8
  128. package/dist/esm/models/cancel-bid200-response.js +2 -2
  129. package/dist/esm/models/card-payment-request-response-dto.d.ts +2 -2
  130. package/dist/esm/models/card-payment-request-response-dto.js +2 -2
  131. package/dist/esm/models/complete-acceptance-request-dto.d.ts +2 -2
  132. package/dist/esm/models/complete-acceptance-request-dto.js +2 -2
  133. package/dist/esm/models/complete-acceptance200-response.d.ts +2 -8
  134. package/dist/esm/models/complete-acceptance200-response.js +2 -2
  135. package/dist/esm/models/complete-invoice200-response.d.ts +2 -8
  136. package/dist/esm/models/complete-invoice200-response.js +2 -2
  137. package/dist/esm/models/complete-upload-request-dto.d.ts +2 -2
  138. package/dist/esm/models/complete-upload-request-dto.js +2 -2
  139. package/dist/esm/models/contract-restriction-confirm-input-dto.d.ts +2 -2
  140. package/dist/esm/models/contract-restriction-confirm-input-dto.js +2 -2
  141. package/dist/esm/models/create-bid-request-dto.d.ts +2 -2
  142. package/dist/esm/models/create-bid-request-dto.js +2 -2
  143. package/dist/esm/models/create-card-payment-dto.d.ts +2 -2
  144. package/dist/esm/models/create-card-payment-dto.js +2 -2
  145. package/dist/esm/models/create-card-payment-request-dto.d.ts +2 -2
  146. package/dist/esm/models/create-card-payment-request-dto.js +2 -2
  147. package/dist/esm/models/create-card-payment200-response.d.ts +2 -8
  148. package/dist/esm/models/create-card-payment200-response.js +2 -2
  149. package/dist/esm/models/create-embed-launch201-response.d.ts +2 -8
  150. package/dist/esm/models/create-embed-launch201-response.js +2 -2
  151. package/dist/esm/models/create-external-contract-documents-request-dto.d.ts +2 -2
  152. package/dist/esm/models/create-external-contract-documents-request-dto.js +2 -2
  153. package/dist/esm/models/create-external-contract-documents-response-dto.d.ts +2 -2
  154. package/dist/esm/models/create-external-contract-documents-response-dto.js +2 -2
  155. package/dist/esm/models/create-file-upload-url201-response.d.ts +2 -8
  156. package/dist/esm/models/create-file-upload-url201-response.js +2 -2
  157. package/dist/esm/models/create-upload-url-request-dto.d.ts +2 -2
  158. package/dist/esm/models/create-upload-url-request-dto.js +2 -2
  159. package/dist/esm/models/create-webhook-endpoint-request-dto.d.ts +22 -0
  160. package/dist/esm/models/create-webhook-endpoint-request-dto.js +14 -0
  161. package/dist/esm/models/create-webhook-endpoint201-response.d.ts +15 -0
  162. package/dist/esm/models/create-webhook-endpoint201-response.js +14 -0
  163. package/dist/esm/models/delivery-date-type-public.d.ts +2 -2
  164. package/dist/esm/models/delivery-date-type-public.js +2 -2
  165. package/dist/esm/models/delivery-method-public.d.ts +2 -2
  166. package/dist/esm/models/delivery-method-public.js +2 -2
  167. package/dist/esm/models/embed-launch-request-dto.d.ts +2 -2
  168. package/dist/esm/models/embed-launch-request-dto.js +2 -2
  169. package/dist/esm/models/embed-launch-response-dto.d.ts +2 -2
  170. package/dist/esm/models/embed-launch-response-dto.js +2 -2
  171. package/dist/esm/models/excellent-procurement-public.d.ts +2 -2
  172. package/dist/esm/models/excellent-procurement-public.js +2 -2
  173. package/dist/esm/models/external-contract-document-item-dto.d.ts +2 -2
  174. package/dist/esm/models/external-contract-document-item-dto.js +2 -2
  175. package/dist/esm/models/external-contract-documents-response-dto.d.ts +2 -2
  176. package/dist/esm/models/external-contract-documents-response-dto.js +2 -2
  177. package/dist/esm/models/external-contract-item-dto.d.ts +2 -2
  178. package/dist/esm/models/external-contract-item-dto.js +2 -2
  179. package/dist/esm/models/external-contract-snapshot-dto.d.ts +2 -2
  180. package/dist/esm/models/external-contract-snapshot-dto.js +2 -2
  181. package/dist/esm/models/external-document-inputs-dto.d.ts +2 -2
  182. package/dist/esm/models/external-document-inputs-dto.js +2 -2
  183. package/dist/esm/models/file-meta-response-dto.d.ts +2 -2
  184. package/dist/esm/models/file-meta-response-dto.js +2 -2
  185. package/dist/esm/models/file-uploaded-response-dto.d.ts +2 -2
  186. package/dist/esm/models/file-uploaded-response-dto.js +2 -2
  187. package/dist/esm/models/generated-external-contract-document-dto.d.ts +2 -2
  188. package/dist/esm/models/generated-external-contract-document-dto.js +2 -2
  189. package/dist/esm/models/get-bid-settlement200-response.d.ts +2 -8
  190. package/dist/esm/models/get-bid-settlement200-response.js +2 -2
  191. package/dist/esm/models/get-bid-statement200-response.d.ts +2 -8
  192. package/dist/esm/models/get-bid-statement200-response.js +2 -2
  193. package/dist/esm/models/get-bid200-response.d.ts +2 -8
  194. package/dist/esm/models/get-bid200-response.js +2 -2
  195. package/dist/esm/models/get-file-meta200-response.d.ts +2 -8
  196. package/dist/esm/models/get-file-meta200-response.js +2 -2
  197. package/dist/esm/models/get-supplier-card-payable-v2200-response.d.ts +2 -8
  198. package/dist/esm/models/get-supplier-card-payable-v2200-response.js +2 -2
  199. package/dist/esm/models/get-webhook-endpoint200-response.d.ts +15 -0
  200. package/dist/esm/models/get-webhook-endpoint200-response.js +14 -0
  201. package/dist/esm/models/green-product-public.d.ts +2 -2
  202. package/dist/esm/models/green-product-public.js +2 -2
  203. package/dist/esm/models/health-controller-check200-response.d.ts +2 -8
  204. package/dist/esm/models/health-controller-check200-response.js +2 -2
  205. package/dist/esm/models/health-response-dto.d.ts +2 -2
  206. package/dist/esm/models/health-response-dto.js +2 -2
  207. package/dist/esm/models/hierarchical-region-dto.d.ts +2 -2
  208. package/dist/esm/models/hierarchical-region-dto.js +2 -2
  209. package/dist/esm/models/index.d.ts +16 -1
  210. package/dist/esm/models/index.js +16 -1
  211. package/dist/esm/models/introspect-request-dto.d.ts +2 -2
  212. package/dist/esm/models/introspect-request-dto.js +2 -2
  213. package/dist/esm/models/introspection-response-dto.d.ts +2 -2
  214. package/dist/esm/models/introspection-response-dto.js +2 -2
  215. package/dist/esm/models/invalid-param-dto.d.ts +2 -2
  216. package/dist/esm/models/invalid-param-dto.js +2 -2
  217. package/dist/esm/models/invoice-completed-response-dto.d.ts +2 -2
  218. package/dist/esm/models/invoice-completed-response-dto.js +2 -2
  219. package/dist/esm/models/invoice-split-response-dto.d.ts +2 -2
  220. package/dist/esm/models/invoice-split-response-dto.js +2 -2
  221. package/dist/esm/models/legal-mandatory-public.d.ts +2 -2
  222. package/dist/esm/models/legal-mandatory-public.js +2 -2
  223. package/dist/esm/models/list-bid-results200-response.d.ts +4 -8
  224. package/dist/esm/models/list-bid-results200-response.js +2 -2
  225. package/dist/esm/models/list-bids200-response-meta.d.ts +24 -0
  226. package/dist/esm/models/list-bids200-response-meta.js +14 -0
  227. package/dist/esm/models/list-bids200-response.d.ts +6 -10
  228. package/dist/esm/models/list-bids200-response.js +2 -2
  229. package/dist/esm/models/list-products200-response.d.ts +4 -8
  230. package/dist/esm/models/list-products200-response.js +2 -2
  231. package/dist/esm/models/list-webhook-deliveries-response-dto.d.ts +22 -0
  232. package/dist/esm/models/list-webhook-deliveries-response-dto.js +14 -0
  233. package/dist/esm/models/list-webhook-deliveries200-response.d.ts +15 -0
  234. package/dist/esm/models/list-webhook-deliveries200-response.js +14 -0
  235. package/dist/esm/models/list-webhook-endpoints200-response.d.ts +17 -0
  236. package/dist/esm/models/list-webhook-endpoints200-response.js +14 -0
  237. package/dist/esm/models/mark-bid-failed-request-dto.d.ts +2 -2
  238. package/dist/esm/models/mark-bid-failed-request-dto.js +2 -2
  239. package/dist/esm/models/mark-bid-failed201-response.d.ts +2 -8
  240. package/dist/esm/models/mark-bid-failed201-response.js +2 -2
  241. package/dist/esm/models/negotiation-score-dto.d.ts +2 -2
  242. package/dist/esm/models/negotiation-score-dto.js +2 -2
  243. package/dist/esm/models/negotiation-scored-v2-response-dto.d.ts +2 -2
  244. package/dist/esm/models/negotiation-scored-v2-response-dto.js +2 -2
  245. package/dist/esm/models/oauth-error-response-dto.d.ts +2 -2
  246. package/dist/esm/models/oauth-error-response-dto.js +2 -2
  247. package/dist/esm/models/partner-webhook-delivery-status.d.ts +18 -0
  248. package/dist/esm/models/partner-webhook-delivery-status.js +19 -0
  249. package/dist/esm/models/partner-webhook-endpoint-status.d.ts +19 -0
  250. package/dist/esm/models/partner-webhook-endpoint-status.js +20 -0
  251. package/dist/esm/models/partner-webhook-event-type.d.ts +22 -0
  252. package/dist/esm/models/partner-webhook-event-type.js +23 -0
  253. package/dist/esm/models/payment-method-public.d.ts +2 -2
  254. package/dist/esm/models/payment-method-public.js +2 -2
  255. package/dist/esm/models/preconditions-dto.d.ts +2 -2
  256. package/dist/esm/models/preconditions-dto.js +2 -2
  257. package/dist/esm/models/problem-details-dto.d.ts +2 -2
  258. package/dist/esm/models/problem-details-dto.js +2 -2
  259. package/dist/esm/models/product-receipt-response-dto.d.ts +2 -2
  260. package/dist/esm/models/product-receipt-response-dto.js +2 -2
  261. package/dist/esm/models/product-response-dto.d.ts +2 -2
  262. package/dist/esm/models/product-response-dto.js +2 -2
  263. package/dist/esm/models/protected-resource-metadata-dto.d.ts +2 -2
  264. package/dist/esm/models/protected-resource-metadata-dto.js +2 -2
  265. package/dist/esm/models/register-award-request-dto.d.ts +2 -2
  266. package/dist/esm/models/register-award-request-dto.js +2 -2
  267. package/dist/esm/models/register-award201-response.d.ts +2 -8
  268. package/dist/esm/models/register-award201-response.js +2 -2
  269. package/dist/esm/models/register-bid201-response.d.ts +2 -8
  270. package/dist/esm/models/register-bid201-response.js +2 -2
  271. package/dist/esm/models/register-semo-contract-request-dto.d.ts +2 -2
  272. package/dist/esm/models/register-semo-contract-request-dto.js +2 -2
  273. package/dist/esm/models/request-invoice-split-request-dto.d.ts +2 -2
  274. package/dist/esm/models/request-invoice-split-request-dto.js +2 -2
  275. package/dist/esm/models/request-invoice-split200-response.d.ts +2 -8
  276. package/dist/esm/models/request-invoice-split200-response.js +2 -2
  277. package/dist/esm/models/retiree-roster-input-dto.d.ts +2 -2
  278. package/dist/esm/models/retiree-roster-input-dto.js +2 -2
  279. package/dist/esm/models/retiree-roster-row-dto.d.ts +2 -2
  280. package/dist/esm/models/retiree-roster-row-dto.js +2 -2
  281. package/dist/esm/models/revert-award-request-dto.d.ts +2 -2
  282. package/dist/esm/models/revert-award-request-dto.js +2 -2
  283. package/dist/esm/models/revert-award200-response.d.ts +2 -8
  284. package/dist/esm/models/revert-award200-response.js +2 -2
  285. package/dist/esm/models/revoke-request-dto.d.ts +2 -2
  286. package/dist/esm/models/revoke-request-dto.js +2 -2
  287. package/dist/esm/models/semo-contract-registered-response-dto.d.ts +2 -2
  288. package/dist/esm/models/semo-contract-registered-response-dto.js +2 -2
  289. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.d.ts +2 -2
  290. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.js +2 -2
  291. package/dist/esm/models/send-webhook-test-event200-response.d.ts +15 -0
  292. package/dist/esm/models/send-webhook-test-event200-response.js +14 -0
  293. package/dist/esm/models/statement-document-dto.d.ts +2 -2
  294. package/dist/esm/models/statement-document-dto.js +2 -2
  295. package/dist/esm/models/statement-product-dto.d.ts +2 -2
  296. package/dist/esm/models/statement-product-dto.js +2 -2
  297. package/dist/esm/models/submit-negotiation-scores-request-dto.d.ts +2 -2
  298. package/dist/esm/models/submit-negotiation-scores-request-dto.js +2 -2
  299. package/dist/esm/models/submit-negotiation-scores201-response.d.ts +2 -8
  300. package/dist/esm/models/submit-negotiation-scores201-response.js +2 -2
  301. package/dist/esm/models/supplier-card-payable-response-dto.d.ts +2 -2
  302. package/dist/esm/models/supplier-card-payable-response-dto.js +2 -2
  303. package/dist/esm/models/supplier-tax-type.d.ts +2 -2
  304. package/dist/esm/models/supplier-tax-type.js +2 -2
  305. package/dist/esm/models/token-request-dto.d.ts +2 -2
  306. package/dist/esm/models/token-request-dto.js +2 -2
  307. package/dist/esm/models/token-response-dto.d.ts +2 -2
  308. package/dist/esm/models/token-response-dto.js +2 -2
  309. package/dist/esm/models/update-bid-request-dto.d.ts +2 -2
  310. package/dist/esm/models/update-bid-request-dto.js +2 -2
  311. package/dist/esm/models/update-bid200-response.d.ts +2 -8
  312. package/dist/esm/models/update-bid200-response.js +2 -2
  313. package/dist/esm/models/update-webhook-endpoint-request-dto.d.ts +27 -0
  314. package/dist/esm/models/update-webhook-endpoint-request-dto.js +14 -0
  315. package/dist/esm/models/upload-file-request-dto.d.ts +2 -2
  316. package/dist/esm/models/upload-file-request-dto.js +2 -2
  317. package/dist/esm/models/upload-file201-response.d.ts +2 -8
  318. package/dist/esm/models/upload-file201-response.js +2 -2
  319. package/dist/esm/models/upload-url-created-response-dto.d.ts +2 -2
  320. package/dist/esm/models/upload-url-created-response-dto.js +2 -2
  321. package/dist/esm/models/webhook-delivery-dto.d.ts +73 -0
  322. package/dist/esm/models/webhook-delivery-dto.js +21 -0
  323. package/dist/esm/models/webhook-endpoint-dto.d.ts +55 -0
  324. package/dist/esm/models/webhook-endpoint-dto.js +14 -0
  325. package/dist/esm/models/webhook-endpoint-with-secret-dto.d.ts +59 -0
  326. package/dist/esm/models/webhook-endpoint-with-secret-dto.js +14 -0
  327. package/dist/esm/models/webhook-test-result-dto.d.ts +25 -0
  328. package/dist/esm/models/webhook-test-result-dto.js +14 -0
  329. package/dist/index.d.ts +2 -2
  330. package/dist/index.js +2 -2
  331. package/dist/models/acceptance-result-response-dto.d.ts +2 -2
  332. package/dist/models/acceptance-result-response-dto.js +2 -2
  333. package/dist/models/acknowledge-product-receipt200-response.d.ts +2 -8
  334. package/dist/models/acknowledge-product-receipt200-response.js +2 -2
  335. package/dist/models/acknowledge-products-request-dto.d.ts +2 -2
  336. package/dist/models/acknowledge-products-request-dto.js +2 -2
  337. package/dist/models/api-catalog-dto.d.ts +2 -2
  338. package/dist/models/api-catalog-dto.js +2 -2
  339. package/dist/models/api-catalog-entry-dto.d.ts +2 -2
  340. package/dist/models/api-catalog-entry-dto.js +2 -2
  341. package/dist/models/api-catalog-link-dto.d.ts +2 -2
  342. package/dist/models/api-catalog-link-dto.js +2 -2
  343. package/dist/models/authorization-server-metadata-dto.d.ts +2 -2
  344. package/dist/models/authorization-server-metadata-dto.js +2 -2
  345. package/dist/models/award-method-public.d.ts +2 -2
  346. package/dist/models/award-method-public.js +2 -2
  347. package/dist/models/award-registered-v2-response-dto.d.ts +2 -2
  348. package/dist/models/award-registered-v2-response-dto.js +2 -2
  349. package/dist/models/award-reverted-v2-response-dto.d.ts +2 -2
  350. package/dist/models/award-reverted-v2-response-dto.js +2 -2
  351. package/dist/models/bid-acceptance-dto.d.ts +2 -2
  352. package/dist/models/bid-acceptance-dto.js +2 -2
  353. package/dist/models/bid-attachment-input-dto.d.ts +2 -2
  354. package/dist/models/bid-attachment-input-dto.js +2 -2
  355. package/dist/models/bid-bond-dto.d.ts +2 -2
  356. package/dist/models/bid-bond-dto.js +2 -2
  357. package/dist/models/bid-cancelled-response-dto.d.ts +2 -2
  358. package/dist/models/bid-cancelled-response-dto.js +2 -2
  359. package/dist/models/bid-contact-dto.d.ts +2 -2
  360. package/dist/models/bid-contact-dto.js +2 -2
  361. package/dist/models/bid-contacts-dto.d.ts +2 -2
  362. package/dist/models/bid-contacts-dto.js +2 -2
  363. package/dist/models/bid-contract-document-dto.d.ts +2 -2
  364. package/dist/models/bid-contract-document-dto.js +2 -2
  365. package/dist/models/bid-delivery-terms-dto.d.ts +2 -2
  366. package/dist/models/bid-delivery-terms-dto.js +2 -2
  367. package/dist/models/bid-detail-response-dto.d.ts +2 -2
  368. package/dist/models/bid-detail-response-dto.js +2 -2
  369. package/dist/models/bid-document-dto.d.ts +2 -2
  370. package/dist/models/bid-document-dto.js +2 -2
  371. package/dist/models/bid-failed-v2-response-dto.d.ts +2 -2
  372. package/dist/models/bid-failed-v2-response-dto.js +2 -2
  373. package/dist/models/bid-item-dto.d.ts +2 -2
  374. package/dist/models/bid-item-dto.js +2 -2
  375. package/dist/models/bid-lifecycle-dto.d.ts +2 -2
  376. package/dist/models/bid-lifecycle-dto.js +2 -2
  377. package/dist/models/bid-manager-dto.d.ts +2 -2
  378. package/dist/models/bid-manager-dto.js +2 -2
  379. package/dist/models/bid-payment-terms-dto.d.ts +2 -2
  380. package/dist/models/bid-payment-terms-dto.js +2 -2
  381. package/dist/models/bid-product-dto.d.ts +2 -2
  382. package/dist/models/bid-product-dto.js +2 -2
  383. package/dist/models/bid-public-status.d.ts +2 -2
  384. package/dist/models/bid-public-status.js +2 -2
  385. package/dist/models/bid-registered-response-dto.d.ts +2 -2
  386. package/dist/models/bid-registered-response-dto.js +2 -2
  387. package/dist/models/bid-result-participant-attachment-dto.d.ts +2 -2
  388. package/dist/models/bid-result-participant-attachment-dto.js +2 -2
  389. package/dist/models/bid-result-participant-dto.d.ts +2 -2
  390. package/dist/models/bid-result-participant-dto.js +2 -2
  391. package/dist/models/bid-results-response-dto.d.ts +2 -2
  392. package/dist/models/bid-results-response-dto.js +2 -2
  393. package/dist/models/bid-settlement-line-item-dto.d.ts +2 -2
  394. package/dist/models/bid-settlement-line-item-dto.js +2 -2
  395. package/dist/models/bid-settlement-participant-dto.d.ts +2 -2
  396. package/dist/models/bid-settlement-participant-dto.js +2 -2
  397. package/dist/models/bid-settlement-response-dto.d.ts +2 -2
  398. package/dist/models/bid-settlement-response-dto.js +2 -2
  399. package/dist/models/bid-statement-response-dto.d.ts +2 -2
  400. package/dist/models/bid-statement-response-dto.js +2 -2
  401. package/dist/models/bid-summary-dto.d.ts +2 -2
  402. package/dist/models/bid-summary-dto.js +2 -2
  403. package/dist/models/bid-type-public.d.ts +2 -2
  404. package/dist/models/bid-type-public.js +2 -2
  405. package/dist/models/bid-updated-response-dto.d.ts +2 -2
  406. package/dist/models/bid-updated-response-dto.js +2 -2
  407. package/dist/models/cancel-bid-request-dto.d.ts +2 -2
  408. package/dist/models/cancel-bid-request-dto.js +2 -2
  409. package/dist/models/cancel-bid200-response.d.ts +2 -8
  410. package/dist/models/cancel-bid200-response.js +2 -2
  411. package/dist/models/card-payment-request-response-dto.d.ts +2 -2
  412. package/dist/models/card-payment-request-response-dto.js +2 -2
  413. package/dist/models/complete-acceptance-request-dto.d.ts +2 -2
  414. package/dist/models/complete-acceptance-request-dto.js +2 -2
  415. package/dist/models/complete-acceptance200-response.d.ts +2 -8
  416. package/dist/models/complete-acceptance200-response.js +2 -2
  417. package/dist/models/complete-invoice200-response.d.ts +2 -8
  418. package/dist/models/complete-invoice200-response.js +2 -2
  419. package/dist/models/complete-upload-request-dto.d.ts +2 -2
  420. package/dist/models/complete-upload-request-dto.js +2 -2
  421. package/dist/models/contract-restriction-confirm-input-dto.d.ts +2 -2
  422. package/dist/models/contract-restriction-confirm-input-dto.js +2 -2
  423. package/dist/models/create-bid-request-dto.d.ts +2 -2
  424. package/dist/models/create-bid-request-dto.js +2 -2
  425. package/dist/models/create-card-payment-dto.d.ts +2 -2
  426. package/dist/models/create-card-payment-dto.js +2 -2
  427. package/dist/models/create-card-payment-request-dto.d.ts +2 -2
  428. package/dist/models/create-card-payment-request-dto.js +2 -2
  429. package/dist/models/create-card-payment200-response.d.ts +2 -8
  430. package/dist/models/create-card-payment200-response.js +2 -2
  431. package/dist/models/create-embed-launch201-response.d.ts +2 -8
  432. package/dist/models/create-embed-launch201-response.js +2 -2
  433. package/dist/models/create-external-contract-documents-request-dto.d.ts +2 -2
  434. package/dist/models/create-external-contract-documents-request-dto.js +2 -2
  435. package/dist/models/create-external-contract-documents-response-dto.d.ts +2 -2
  436. package/dist/models/create-external-contract-documents-response-dto.js +2 -2
  437. package/dist/models/create-file-upload-url201-response.d.ts +2 -8
  438. package/dist/models/create-file-upload-url201-response.js +2 -2
  439. package/dist/models/create-upload-url-request-dto.d.ts +2 -2
  440. package/dist/models/create-upload-url-request-dto.js +2 -2
  441. package/dist/models/create-webhook-endpoint-request-dto.d.ts +22 -0
  442. package/dist/models/create-webhook-endpoint-request-dto.js +15 -0
  443. package/dist/models/create-webhook-endpoint201-response.d.ts +15 -0
  444. package/dist/models/create-webhook-endpoint201-response.js +15 -0
  445. package/dist/models/delivery-date-type-public.d.ts +2 -2
  446. package/dist/models/delivery-date-type-public.js +2 -2
  447. package/dist/models/delivery-method-public.d.ts +2 -2
  448. package/dist/models/delivery-method-public.js +2 -2
  449. package/dist/models/embed-launch-request-dto.d.ts +2 -2
  450. package/dist/models/embed-launch-request-dto.js +2 -2
  451. package/dist/models/embed-launch-response-dto.d.ts +2 -2
  452. package/dist/models/embed-launch-response-dto.js +2 -2
  453. package/dist/models/excellent-procurement-public.d.ts +2 -2
  454. package/dist/models/excellent-procurement-public.js +2 -2
  455. package/dist/models/external-contract-document-item-dto.d.ts +2 -2
  456. package/dist/models/external-contract-document-item-dto.js +2 -2
  457. package/dist/models/external-contract-documents-response-dto.d.ts +2 -2
  458. package/dist/models/external-contract-documents-response-dto.js +2 -2
  459. package/dist/models/external-contract-item-dto.d.ts +2 -2
  460. package/dist/models/external-contract-item-dto.js +2 -2
  461. package/dist/models/external-contract-snapshot-dto.d.ts +2 -2
  462. package/dist/models/external-contract-snapshot-dto.js +2 -2
  463. package/dist/models/external-document-inputs-dto.d.ts +2 -2
  464. package/dist/models/external-document-inputs-dto.js +2 -2
  465. package/dist/models/file-meta-response-dto.d.ts +2 -2
  466. package/dist/models/file-meta-response-dto.js +2 -2
  467. package/dist/models/file-uploaded-response-dto.d.ts +2 -2
  468. package/dist/models/file-uploaded-response-dto.js +2 -2
  469. package/dist/models/generated-external-contract-document-dto.d.ts +2 -2
  470. package/dist/models/generated-external-contract-document-dto.js +2 -2
  471. package/dist/models/get-bid-settlement200-response.d.ts +2 -8
  472. package/dist/models/get-bid-settlement200-response.js +2 -2
  473. package/dist/models/get-bid-statement200-response.d.ts +2 -8
  474. package/dist/models/get-bid-statement200-response.js +2 -2
  475. package/dist/models/get-bid200-response.d.ts +2 -8
  476. package/dist/models/get-bid200-response.js +2 -2
  477. package/dist/models/get-file-meta200-response.d.ts +2 -8
  478. package/dist/models/get-file-meta200-response.js +2 -2
  479. package/dist/models/get-supplier-card-payable-v2200-response.d.ts +2 -8
  480. package/dist/models/get-supplier-card-payable-v2200-response.js +2 -2
  481. package/dist/models/get-webhook-endpoint200-response.d.ts +15 -0
  482. package/dist/models/get-webhook-endpoint200-response.js +15 -0
  483. package/dist/models/green-product-public.d.ts +2 -2
  484. package/dist/models/green-product-public.js +2 -2
  485. package/dist/models/health-controller-check200-response.d.ts +2 -8
  486. package/dist/models/health-controller-check200-response.js +2 -2
  487. package/dist/models/health-response-dto.d.ts +2 -2
  488. package/dist/models/health-response-dto.js +2 -2
  489. package/dist/models/hierarchical-region-dto.d.ts +2 -2
  490. package/dist/models/hierarchical-region-dto.js +2 -2
  491. package/dist/models/index.d.ts +16 -1
  492. package/dist/models/index.js +16 -1
  493. package/dist/models/introspect-request-dto.d.ts +2 -2
  494. package/dist/models/introspect-request-dto.js +2 -2
  495. package/dist/models/introspection-response-dto.d.ts +2 -2
  496. package/dist/models/introspection-response-dto.js +2 -2
  497. package/dist/models/invalid-param-dto.d.ts +2 -2
  498. package/dist/models/invalid-param-dto.js +2 -2
  499. package/dist/models/invoice-completed-response-dto.d.ts +2 -2
  500. package/dist/models/invoice-completed-response-dto.js +2 -2
  501. package/dist/models/invoice-split-response-dto.d.ts +2 -2
  502. package/dist/models/invoice-split-response-dto.js +2 -2
  503. package/dist/models/legal-mandatory-public.d.ts +2 -2
  504. package/dist/models/legal-mandatory-public.js +2 -2
  505. package/dist/models/list-bid-results200-response.d.ts +4 -8
  506. package/dist/models/list-bid-results200-response.js +2 -2
  507. package/dist/models/list-bids200-response-meta.d.ts +24 -0
  508. package/dist/models/list-bids200-response-meta.js +15 -0
  509. package/dist/models/list-bids200-response.d.ts +6 -10
  510. package/dist/models/list-bids200-response.js +2 -2
  511. package/dist/models/list-products200-response.d.ts +4 -8
  512. package/dist/models/list-products200-response.js +2 -2
  513. package/dist/models/list-webhook-deliveries-response-dto.d.ts +22 -0
  514. package/dist/models/list-webhook-deliveries-response-dto.js +15 -0
  515. package/dist/models/list-webhook-deliveries200-response.d.ts +15 -0
  516. package/dist/models/list-webhook-deliveries200-response.js +15 -0
  517. package/dist/models/list-webhook-endpoints200-response.d.ts +17 -0
  518. package/dist/models/list-webhook-endpoints200-response.js +15 -0
  519. package/dist/models/mark-bid-failed-request-dto.d.ts +2 -2
  520. package/dist/models/mark-bid-failed-request-dto.js +2 -2
  521. package/dist/models/mark-bid-failed201-response.d.ts +2 -8
  522. package/dist/models/mark-bid-failed201-response.js +2 -2
  523. package/dist/models/negotiation-score-dto.d.ts +2 -2
  524. package/dist/models/negotiation-score-dto.js +2 -2
  525. package/dist/models/negotiation-scored-v2-response-dto.d.ts +2 -2
  526. package/dist/models/negotiation-scored-v2-response-dto.js +2 -2
  527. package/dist/models/oauth-error-response-dto.d.ts +2 -2
  528. package/dist/models/oauth-error-response-dto.js +2 -2
  529. package/dist/models/partner-webhook-delivery-status.d.ts +18 -0
  530. package/dist/models/partner-webhook-delivery-status.js +22 -0
  531. package/dist/models/partner-webhook-endpoint-status.d.ts +19 -0
  532. package/dist/models/partner-webhook-endpoint-status.js +23 -0
  533. package/dist/models/partner-webhook-event-type.d.ts +22 -0
  534. package/dist/models/partner-webhook-event-type.js +26 -0
  535. package/dist/models/payment-method-public.d.ts +2 -2
  536. package/dist/models/payment-method-public.js +2 -2
  537. package/dist/models/preconditions-dto.d.ts +2 -2
  538. package/dist/models/preconditions-dto.js +2 -2
  539. package/dist/models/problem-details-dto.d.ts +2 -2
  540. package/dist/models/problem-details-dto.js +2 -2
  541. package/dist/models/product-receipt-response-dto.d.ts +2 -2
  542. package/dist/models/product-receipt-response-dto.js +2 -2
  543. package/dist/models/product-response-dto.d.ts +2 -2
  544. package/dist/models/product-response-dto.js +2 -2
  545. package/dist/models/protected-resource-metadata-dto.d.ts +2 -2
  546. package/dist/models/protected-resource-metadata-dto.js +2 -2
  547. package/dist/models/register-award-request-dto.d.ts +2 -2
  548. package/dist/models/register-award-request-dto.js +2 -2
  549. package/dist/models/register-award201-response.d.ts +2 -8
  550. package/dist/models/register-award201-response.js +2 -2
  551. package/dist/models/register-bid201-response.d.ts +2 -8
  552. package/dist/models/register-bid201-response.js +2 -2
  553. package/dist/models/register-semo-contract-request-dto.d.ts +2 -2
  554. package/dist/models/register-semo-contract-request-dto.js +2 -2
  555. package/dist/models/request-invoice-split-request-dto.d.ts +2 -2
  556. package/dist/models/request-invoice-split-request-dto.js +2 -2
  557. package/dist/models/request-invoice-split200-response.d.ts +2 -8
  558. package/dist/models/request-invoice-split200-response.js +2 -2
  559. package/dist/models/retiree-roster-input-dto.d.ts +2 -2
  560. package/dist/models/retiree-roster-input-dto.js +2 -2
  561. package/dist/models/retiree-roster-row-dto.d.ts +2 -2
  562. package/dist/models/retiree-roster-row-dto.js +2 -2
  563. package/dist/models/revert-award-request-dto.d.ts +2 -2
  564. package/dist/models/revert-award-request-dto.js +2 -2
  565. package/dist/models/revert-award200-response.d.ts +2 -8
  566. package/dist/models/revert-award200-response.js +2 -2
  567. package/dist/models/revoke-request-dto.d.ts +2 -2
  568. package/dist/models/revoke-request-dto.js +2 -2
  569. package/dist/models/semo-contract-registered-response-dto.d.ts +2 -2
  570. package/dist/models/semo-contract-registered-response-dto.js +2 -2
  571. package/dist/models/semo-contract-taxinvoice-status-response-dto.d.ts +2 -2
  572. package/dist/models/semo-contract-taxinvoice-status-response-dto.js +2 -2
  573. package/dist/models/send-webhook-test-event200-response.d.ts +15 -0
  574. package/dist/models/send-webhook-test-event200-response.js +15 -0
  575. package/dist/models/statement-document-dto.d.ts +2 -2
  576. package/dist/models/statement-document-dto.js +2 -2
  577. package/dist/models/statement-product-dto.d.ts +2 -2
  578. package/dist/models/statement-product-dto.js +2 -2
  579. package/dist/models/submit-negotiation-scores-request-dto.d.ts +2 -2
  580. package/dist/models/submit-negotiation-scores-request-dto.js +2 -2
  581. package/dist/models/submit-negotiation-scores201-response.d.ts +2 -8
  582. package/dist/models/submit-negotiation-scores201-response.js +2 -2
  583. package/dist/models/supplier-card-payable-response-dto.d.ts +2 -2
  584. package/dist/models/supplier-card-payable-response-dto.js +2 -2
  585. package/dist/models/supplier-tax-type.d.ts +2 -2
  586. package/dist/models/supplier-tax-type.js +2 -2
  587. package/dist/models/token-request-dto.d.ts +2 -2
  588. package/dist/models/token-request-dto.js +2 -2
  589. package/dist/models/token-response-dto.d.ts +2 -2
  590. package/dist/models/token-response-dto.js +2 -2
  591. package/dist/models/update-bid-request-dto.d.ts +2 -2
  592. package/dist/models/update-bid-request-dto.js +2 -2
  593. package/dist/models/update-bid200-response.d.ts +2 -8
  594. package/dist/models/update-bid200-response.js +2 -2
  595. package/dist/models/update-webhook-endpoint-request-dto.d.ts +27 -0
  596. package/dist/models/update-webhook-endpoint-request-dto.js +15 -0
  597. package/dist/models/upload-file-request-dto.d.ts +2 -2
  598. package/dist/models/upload-file-request-dto.js +2 -2
  599. package/dist/models/upload-file201-response.d.ts +2 -8
  600. package/dist/models/upload-file201-response.js +2 -2
  601. package/dist/models/upload-url-created-response-dto.d.ts +2 -2
  602. package/dist/models/upload-url-created-response-dto.js +2 -2
  603. package/dist/models/webhook-delivery-dto.d.ts +73 -0
  604. package/dist/models/webhook-delivery-dto.js +24 -0
  605. package/dist/models/webhook-endpoint-dto.d.ts +55 -0
  606. package/dist/models/webhook-endpoint-dto.js +15 -0
  607. package/dist/models/webhook-endpoint-with-secret-dto.d.ts +59 -0
  608. package/dist/models/webhook-endpoint-with-secret-dto.js +15 -0
  609. package/dist/models/webhook-test-result-dto.d.ts +25 -0
  610. package/dist/models/webhook-test-result-dto.js +15 -0
  611. package/docs/AcknowledgeProductReceipt200Response.md +0 -2
  612. package/docs/CancelBid200Response.md +0 -2
  613. package/docs/CompleteAcceptance200Response.md +0 -2
  614. package/docs/CompleteInvoice200Response.md +0 -2
  615. package/docs/CreateCardPayment200Response.md +0 -2
  616. package/docs/CreateEmbedLaunch201Response.md +0 -2
  617. package/docs/CreateFileUploadUrl201Response.md +0 -2
  618. package/docs/CreateWebhookEndpoint201Response.md +20 -0
  619. package/docs/CreateWebhookEndpointRequestDto.md +22 -0
  620. package/docs/GetBid200Response.md +0 -2
  621. package/docs/GetBidSettlement200Response.md +0 -2
  622. package/docs/GetBidStatement200Response.md +0 -2
  623. package/docs/GetFileMeta200Response.md +0 -2
  624. package/docs/GetSupplierCardPayableV2200Response.md +0 -2
  625. package/docs/GetWebhookEndpoint200Response.md +20 -0
  626. package/docs/HealthControllerCheck200Response.md +0 -2
  627. package/docs/ListBidResults200Response.md +1 -1
  628. package/docs/ListBids200Response.md +2 -2
  629. package/docs/ListBids200ResponseMeta.md +23 -0
  630. package/docs/ListProducts200Response.md +1 -1
  631. package/docs/ListWebhookDeliveries200Response.md +20 -0
  632. package/docs/{ListBidsResponseDto.md → ListWebhookDeliveriesResponseDto.md} +4 -4
  633. package/docs/ListWebhookEndpoints200Response.md +22 -0
  634. package/docs/MarkBidFailed201Response.md +0 -2
  635. package/docs/PartnerApiApi.md +520 -3
  636. package/docs/PartnerWebhookDeliveryStatus.md +14 -0
  637. package/docs/PartnerWebhookEndpointStatus.md +11 -0
  638. package/docs/PartnerWebhookEventType.md +17 -0
  639. package/docs/ProductsApi.md +10 -3
  640. package/docs/RegisterAward201Response.md +0 -2
  641. package/docs/RegisterBid201Response.md +0 -2
  642. package/docs/RequestInvoiceSplit200Response.md +0 -2
  643. package/docs/RevertAward200Response.md +0 -2
  644. package/docs/SendWebhookTestEvent200Response.md +20 -0
  645. package/docs/SubmitNegotiationScores201Response.md +0 -2
  646. package/docs/UpdateBid200Response.md +0 -2
  647. package/docs/UpdateWebhookEndpointRequestDto.md +24 -0
  648. package/docs/UploadFile201Response.md +0 -2
  649. package/docs/WebhookDeliveryDto.md +42 -0
  650. package/docs/WebhookEndpointDto.md +38 -0
  651. package/docs/WebhookEndpointWithSecretDto.md +40 -0
  652. package/docs/WebhookTestResultDto.md +24 -0
  653. package/index.ts +2 -2
  654. package/models/acceptance-result-response-dto.ts +2 -2
  655. package/models/acknowledge-product-receipt200-response.ts +2 -6
  656. package/models/acknowledge-products-request-dto.ts +2 -2
  657. package/models/api-catalog-dto.ts +2 -2
  658. package/models/api-catalog-entry-dto.ts +2 -2
  659. package/models/api-catalog-link-dto.ts +2 -2
  660. package/models/authorization-server-metadata-dto.ts +2 -2
  661. package/models/award-method-public.ts +2 -2
  662. package/models/award-registered-v2-response-dto.ts +2 -2
  663. package/models/award-reverted-v2-response-dto.ts +2 -2
  664. package/models/bid-acceptance-dto.ts +2 -2
  665. package/models/bid-attachment-input-dto.ts +2 -2
  666. package/models/bid-bond-dto.ts +2 -2
  667. package/models/bid-cancelled-response-dto.ts +2 -2
  668. package/models/bid-contact-dto.ts +2 -2
  669. package/models/bid-contacts-dto.ts +2 -2
  670. package/models/bid-contract-document-dto.ts +2 -2
  671. package/models/bid-delivery-terms-dto.ts +2 -2
  672. package/models/bid-detail-response-dto.ts +2 -2
  673. package/models/bid-document-dto.ts +2 -2
  674. package/models/bid-failed-v2-response-dto.ts +2 -2
  675. package/models/bid-item-dto.ts +2 -2
  676. package/models/bid-lifecycle-dto.ts +2 -2
  677. package/models/bid-manager-dto.ts +2 -2
  678. package/models/bid-payment-terms-dto.ts +2 -2
  679. package/models/bid-product-dto.ts +2 -2
  680. package/models/bid-public-status.ts +2 -2
  681. package/models/bid-registered-response-dto.ts +2 -2
  682. package/models/bid-result-participant-attachment-dto.ts +2 -2
  683. package/models/bid-result-participant-dto.ts +2 -2
  684. package/models/bid-results-response-dto.ts +2 -2
  685. package/models/bid-settlement-line-item-dto.ts +2 -2
  686. package/models/bid-settlement-participant-dto.ts +2 -2
  687. package/models/bid-settlement-response-dto.ts +2 -2
  688. package/models/bid-statement-response-dto.ts +2 -2
  689. package/models/bid-summary-dto.ts +2 -2
  690. package/models/bid-type-public.ts +2 -2
  691. package/models/bid-updated-response-dto.ts +2 -2
  692. package/models/cancel-bid-request-dto.ts +2 -2
  693. package/models/cancel-bid200-response.ts +2 -6
  694. package/models/card-payment-request-response-dto.ts +2 -2
  695. package/models/complete-acceptance-request-dto.ts +2 -2
  696. package/models/complete-acceptance200-response.ts +2 -6
  697. package/models/complete-invoice200-response.ts +2 -6
  698. package/models/complete-upload-request-dto.ts +2 -2
  699. package/models/contract-restriction-confirm-input-dto.ts +2 -2
  700. package/models/create-bid-request-dto.ts +2 -2
  701. package/models/create-card-payment-dto.ts +2 -2
  702. package/models/create-card-payment-request-dto.ts +2 -2
  703. package/models/create-card-payment200-response.ts +2 -6
  704. package/models/create-embed-launch201-response.ts +2 -6
  705. package/models/create-external-contract-documents-request-dto.ts +2 -2
  706. package/models/create-external-contract-documents-response-dto.ts +2 -2
  707. package/models/create-file-upload-url201-response.ts +2 -6
  708. package/models/create-upload-url-request-dto.ts +2 -2
  709. package/models/create-webhook-endpoint-request-dto.ts +30 -0
  710. package/models/create-webhook-endpoint201-response.ts +23 -0
  711. package/models/delivery-date-type-public.ts +2 -2
  712. package/models/delivery-method-public.ts +2 -2
  713. package/models/embed-launch-request-dto.ts +2 -2
  714. package/models/embed-launch-response-dto.ts +2 -2
  715. package/models/excellent-procurement-public.ts +2 -2
  716. package/models/external-contract-document-item-dto.ts +2 -2
  717. package/models/external-contract-documents-response-dto.ts +2 -2
  718. package/models/external-contract-item-dto.ts +2 -2
  719. package/models/external-contract-snapshot-dto.ts +2 -2
  720. package/models/external-document-inputs-dto.ts +2 -2
  721. package/models/file-meta-response-dto.ts +2 -2
  722. package/models/file-uploaded-response-dto.ts +2 -2
  723. package/models/generated-external-contract-document-dto.ts +2 -2
  724. package/models/get-bid-settlement200-response.ts +2 -6
  725. package/models/get-bid-statement200-response.ts +2 -6
  726. package/models/get-bid200-response.ts +2 -6
  727. package/models/get-file-meta200-response.ts +2 -6
  728. package/models/get-supplier-card-payable-v2200-response.ts +2 -6
  729. package/models/get-webhook-endpoint200-response.ts +23 -0
  730. package/models/green-product-public.ts +2 -2
  731. package/models/health-controller-check200-response.ts +2 -6
  732. package/models/health-response-dto.ts +2 -2
  733. package/models/hierarchical-region-dto.ts +2 -2
  734. package/models/index.ts +16 -1
  735. package/models/introspect-request-dto.ts +2 -2
  736. package/models/introspection-response-dto.ts +2 -2
  737. package/models/invalid-param-dto.ts +2 -2
  738. package/models/invoice-completed-response-dto.ts +2 -2
  739. package/models/invoice-split-response-dto.ts +2 -2
  740. package/models/legal-mandatory-public.ts +2 -2
  741. package/models/list-bid-results200-response.ts +6 -6
  742. package/models/list-bids200-response-meta.ts +30 -0
  743. package/models/list-bids200-response.ts +8 -8
  744. package/models/list-products200-response.ts +6 -6
  745. package/models/list-webhook-deliveries-response-dto.ts +30 -0
  746. package/models/list-webhook-deliveries200-response.ts +23 -0
  747. package/models/list-webhook-endpoints200-response.ts +27 -0
  748. package/models/mark-bid-failed-request-dto.ts +2 -2
  749. package/models/mark-bid-failed201-response.ts +2 -6
  750. package/models/negotiation-score-dto.ts +2 -2
  751. package/models/negotiation-scored-v2-response-dto.ts +2 -2
  752. package/models/oauth-error-response-dto.ts +2 -2
  753. package/models/partner-webhook-delivery-status.ts +28 -0
  754. package/models/partner-webhook-endpoint-status.ts +29 -0
  755. package/models/partner-webhook-event-type.ts +32 -0
  756. package/models/payment-method-public.ts +2 -2
  757. package/models/preconditions-dto.ts +2 -2
  758. package/models/problem-details-dto.ts +2 -2
  759. package/models/product-receipt-response-dto.ts +2 -2
  760. package/models/product-response-dto.ts +2 -2
  761. package/models/protected-resource-metadata-dto.ts +2 -2
  762. package/models/register-award-request-dto.ts +2 -2
  763. package/models/register-award201-response.ts +2 -6
  764. package/models/register-bid201-response.ts +2 -6
  765. package/models/register-semo-contract-request-dto.ts +2 -2
  766. package/models/request-invoice-split-request-dto.ts +2 -2
  767. package/models/request-invoice-split200-response.ts +2 -6
  768. package/models/retiree-roster-input-dto.ts +2 -2
  769. package/models/retiree-roster-row-dto.ts +2 -2
  770. package/models/revert-award-request-dto.ts +2 -2
  771. package/models/revert-award200-response.ts +2 -6
  772. package/models/revoke-request-dto.ts +2 -2
  773. package/models/semo-contract-registered-response-dto.ts +2 -2
  774. package/models/semo-contract-taxinvoice-status-response-dto.ts +2 -2
  775. package/models/send-webhook-test-event200-response.ts +23 -0
  776. package/models/statement-document-dto.ts +2 -2
  777. package/models/statement-product-dto.ts +2 -2
  778. package/models/submit-negotiation-scores-request-dto.ts +2 -2
  779. package/models/submit-negotiation-scores201-response.ts +2 -6
  780. package/models/supplier-card-payable-response-dto.ts +2 -2
  781. package/models/supplier-tax-type.ts +2 -2
  782. package/models/token-request-dto.ts +2 -2
  783. package/models/token-response-dto.ts +2 -2
  784. package/models/update-bid-request-dto.ts +2 -2
  785. package/models/update-bid200-response.ts +2 -6
  786. package/models/update-webhook-endpoint-request-dto.ts +39 -0
  787. package/models/upload-file-request-dto.ts +2 -2
  788. package/models/upload-file201-response.ts +2 -6
  789. package/models/upload-url-created-response-dto.ts +2 -2
  790. package/models/webhook-delivery-dto.ts +82 -0
  791. package/models/webhook-endpoint-dto.ts +67 -0
  792. package/models/webhook-endpoint-with-secret-dto.ts +71 -0
  793. package/models/webhook-test-result-dto.ts +31 -0
  794. package/package.json +1 -1
  795. package/dist/esm/models/list-bids-response-dto.d.ts +0 -22
  796. package/dist/esm/models/list-bids-response-dto.js +0 -14
  797. package/dist/models/list-bids-response-dto.d.ts +0 -22
  798. package/dist/models/list-bids-response-dto.js +0 -15
  799. package/models/list-bids-response-dto.ts +0 -30
@@ -2,9 +2,9 @@
2
2
  /* eslint-disable */
3
3
  /**
4
4
  * CMARKET V6 Partner API
5
- * 외부 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\": … }` 입니다. 단일 리소스든 목록이든 같습니다. 목록처럼 부가 정보가 있는 응답은 `meta` 가 함께 실립니다예: `{ \"data\": [...], \"meta\": { \"nextCursor\": \"…\" } }`. 부가 정보가 없으면 `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` 헤더로 통지합니다. 이 헤더를 모니터링하세요.
5
+ * 외부 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
6
  *
7
- * The version of the OpenAPI document: 37.3.1
7
+ * The version of the OpenAPI document: 38.1.0
8
8
  * Contact: semo.io.kr@gmail.com
9
9
  *
10
10
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -50,6 +50,10 @@ import type { CreateFileUploadUrl201Response } from '../models';
50
50
  // @ts-ignore
51
51
  import type { CreateUploadUrlRequestDto } from '../models';
52
52
  // @ts-ignore
53
+ import type { CreateWebhookEndpoint201Response } from '../models';
54
+ // @ts-ignore
55
+ import type { CreateWebhookEndpointRequestDto } from '../models';
56
+ // @ts-ignore
53
57
  import type { ExternalContractDocumentsResponseDto } from '../models';
54
58
  // @ts-ignore
55
59
  import type { GetBid200Response } from '../models';
@@ -62,16 +66,24 @@ import type { GetFileMeta200Response } from '../models';
62
66
  // @ts-ignore
63
67
  import type { GetSupplierCardPayableV2200Response } from '../models';
64
68
  // @ts-ignore
69
+ import type { GetWebhookEndpoint200Response } from '../models';
70
+ // @ts-ignore
65
71
  import type { HealthControllerCheck200Response } from '../models';
66
72
  // @ts-ignore
67
73
  import type { ListBidResults200Response } from '../models';
68
74
  // @ts-ignore
69
75
  import type { ListBids200Response } from '../models';
70
76
  // @ts-ignore
77
+ import type { ListWebhookDeliveries200Response } from '../models';
78
+ // @ts-ignore
79
+ import type { ListWebhookEndpoints200Response } from '../models';
80
+ // @ts-ignore
71
81
  import type { MarkBidFailed201Response } from '../models';
72
82
  // @ts-ignore
73
83
  import type { MarkBidFailedRequestDto } from '../models';
74
84
  // @ts-ignore
85
+ import type { PartnerWebhookDeliveryStatus } from '../models';
86
+ // @ts-ignore
75
87
  import type { ProblemDetailsDto } from '../models';
76
88
  // @ts-ignore
77
89
  import type { RegisterAward201Response } from '../models';
@@ -94,6 +106,8 @@ import type { SemoContractRegisteredResponseDto } from '../models';
94
106
  // @ts-ignore
95
107
  import type { SemoContractTaxinvoiceStatusResponseDto } from '../models';
96
108
  // @ts-ignore
109
+ import type { SendWebhookTestEvent200Response } from '../models';
110
+ // @ts-ignore
97
111
  import type { SubmitNegotiationScores201Response } from '../models';
98
112
  // @ts-ignore
99
113
  import type { SubmitNegotiationScoresRequestDto } from '../models';
@@ -102,6 +116,8 @@ import type { UpdateBid200Response } from '../models';
102
116
  // @ts-ignore
103
117
  import type { UpdateBidRequestDto } from '../models';
104
118
  // @ts-ignore
119
+ import type { UpdateWebhookEndpointRequestDto } from '../models';
120
+ // @ts-ignore
105
121
  import type { UploadFile201Response } from '../models';
106
122
  // @ts-ignore
107
123
  import type { UploadFileRequestDto } from '../models';
@@ -436,6 +452,101 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
436
452
  options: localVarRequestOptions,
437
453
  };
438
454
  },
455
+ /**
456
+ * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
457
+ * @summary 웹훅 구독 등록
458
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
459
+ * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
460
+ * @param {*} [options] Override http request option.
461
+ * @throws {RequiredError}
462
+ */
463
+ createWebhookEndpoint: async (idempotencyKey: string, createWebhookEndpointRequestDto: CreateWebhookEndpointRequestDto, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
464
+ // verify required parameter 'idempotencyKey' is not null or undefined
465
+ assertParamExists('createWebhookEndpoint', 'idempotencyKey', idempotencyKey)
466
+ // verify required parameter 'createWebhookEndpointRequestDto' is not null or undefined
467
+ assertParamExists('createWebhookEndpoint', 'createWebhookEndpointRequestDto', createWebhookEndpointRequestDto)
468
+ const localVarPath = `/v2/webhook-endpoints`;
469
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
470
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
471
+ let baseOptions;
472
+ if (configuration) {
473
+ baseOptions = configuration.baseOptions;
474
+ }
475
+
476
+ const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
477
+ const localVarHeaderParameter = {} as any;
478
+ const localVarQueryParameter = {} as any;
479
+
480
+ // authentication partner-oauth2 required
481
+ // oauth required
482
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:write"], configuration)
483
+
484
+ localVarHeaderParameter['Content-Type'] = 'application/json';
485
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
486
+
487
+ if (idempotencyKey != null) {
488
+ localVarHeaderParameter['Idempotency-Key'] = String(idempotencyKey);
489
+ }
490
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
491
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
492
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
493
+ localVarRequestOptions.data = serializeDataIfNeeded(createWebhookEndpointRequestDto, localVarRequestOptions, configuration)
494
+
495
+ return {
496
+ url: toPathString(localVarUrlObj),
497
+ options: localVarRequestOptions,
498
+ };
499
+ },
500
+ /**
501
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH … {\"status\":\"DISABLED\"}` 를 쓰세요 — 시크릿과 이벤트 구성이 남아 그대로 되살릴 수 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 가 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` — 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
502
+ * @summary 웹훅 구독 삭제
503
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
504
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
505
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
506
+ * @param {*} [options] Override http request option.
507
+ * @throws {RequiredError}
508
+ */
509
+ deleteWebhookEndpoint: async (endpointId: string, ifMatch: string, idempotencyKey: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
510
+ // verify required parameter 'endpointId' is not null or undefined
511
+ assertParamExists('deleteWebhookEndpoint', 'endpointId', endpointId)
512
+ // verify required parameter 'ifMatch' is not null or undefined
513
+ assertParamExists('deleteWebhookEndpoint', 'ifMatch', ifMatch)
514
+ // verify required parameter 'idempotencyKey' is not null or undefined
515
+ assertParamExists('deleteWebhookEndpoint', 'idempotencyKey', idempotencyKey)
516
+ const localVarPath = `/v2/webhook-endpoints/{endpointId}`
517
+ .replace('{endpointId}', encodeURIComponent(String(endpointId)));
518
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
519
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
520
+ let baseOptions;
521
+ if (configuration) {
522
+ baseOptions = configuration.baseOptions;
523
+ }
524
+
525
+ const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};
526
+ const localVarHeaderParameter = {} as any;
527
+ const localVarQueryParameter = {} as any;
528
+
529
+ // authentication partner-oauth2 required
530
+ // oauth required
531
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:write"], configuration)
532
+
533
+ localVarHeaderParameter['Accept'] = 'application/problem+json';
534
+
535
+ if (ifMatch != null) {
536
+ localVarHeaderParameter['If-Match'] = String(ifMatch);
537
+ }
538
+ if (idempotencyKey != null) {
539
+ localVarHeaderParameter['Idempotency-Key'] = String(idempotencyKey);
540
+ }
541
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
542
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
543
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
544
+
545
+ return {
546
+ url: toPathString(localVarUrlObj),
547
+ options: localVarRequestOptions,
548
+ };
549
+ },
439
550
  /**
440
551
  * 무인증 — `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` 이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
441
552
  * @summary 파일 다운로드
@@ -702,6 +813,44 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
702
813
  options: localVarRequestOptions,
703
814
  };
704
815
  },
816
+ /**
817
+ * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` 를 `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 — `endpointId` 를 확인하세요. **필수 스코프:** `webhooks:read`
818
+ * @summary 웹훅 구독 단건 조회
819
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
820
+ * @param {*} [options] Override http request option.
821
+ * @throws {RequiredError}
822
+ */
823
+ getWebhookEndpoint: async (endpointId: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
824
+ // verify required parameter 'endpointId' is not null or undefined
825
+ assertParamExists('getWebhookEndpoint', 'endpointId', endpointId)
826
+ const localVarPath = `/v2/webhook-endpoints/{endpointId}`
827
+ .replace('{endpointId}', encodeURIComponent(String(endpointId)));
828
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
829
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
830
+ let baseOptions;
831
+ if (configuration) {
832
+ baseOptions = configuration.baseOptions;
833
+ }
834
+
835
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
836
+ const localVarHeaderParameter = {} as any;
837
+ const localVarQueryParameter = {} as any;
838
+
839
+ // authentication partner-oauth2 required
840
+ // oauth required
841
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:read"], configuration)
842
+
843
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
844
+
845
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
846
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
847
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
848
+
849
+ return {
850
+ url: toPathString(localVarUrlObj),
851
+ options: localVarRequestOptions,
852
+ };
853
+ },
705
854
  /**
706
855
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
707
856
  * @summary Partner API 헬스체크
@@ -774,7 +923,7 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
774
923
  };
775
924
  },
776
925
  /**
777
- * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답의 `nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `nextCursor=null` 이면 마지막 페이지입니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
926
+ * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `meta.hasMore` 가 `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
778
927
  * @summary 공고 목록 조회
779
928
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
780
929
  * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달한다. 미지정 시 첫 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
@@ -880,6 +1029,94 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
880
1029
  options: localVarRequestOptions,
881
1030
  };
882
1031
  },
1032
+ /**
1033
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 로 걸러 다시 처리하면 됩니다. - \"이벤트가 안 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 가 같고 `attempt` 만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 를 다음 요청의 `cursor` 로 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
1034
+ * @summary 웹훅 전송 이력 조회
1035
+ * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
1036
+ * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
1037
+ * @param {number} [limit] 페이지 크기(1~200, 기본 50).
1038
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달합니다. 미지정 시 첫 페이지.
1039
+ * @param {*} [options] Override http request option.
1040
+ * @throws {RequiredError}
1041
+ */
1042
+ listWebhookDeliveries: async (endpointId?: string, status?: PartnerWebhookDeliveryStatus, limit?: number, cursor?: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
1043
+ const localVarPath = `/v2/webhook-deliveries`;
1044
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
1045
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
1046
+ let baseOptions;
1047
+ if (configuration) {
1048
+ baseOptions = configuration.baseOptions;
1049
+ }
1050
+
1051
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
1052
+ const localVarHeaderParameter = {} as any;
1053
+ const localVarQueryParameter = {} as any;
1054
+
1055
+ // authentication partner-oauth2 required
1056
+ // oauth required
1057
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:read"], configuration)
1058
+
1059
+ if (endpointId !== undefined) {
1060
+ localVarQueryParameter['endpointId'] = endpointId;
1061
+ }
1062
+
1063
+ if (status !== undefined) {
1064
+ localVarQueryParameter['status'] = status;
1065
+ }
1066
+
1067
+ if (limit !== undefined) {
1068
+ localVarQueryParameter['limit'] = limit;
1069
+ }
1070
+
1071
+ if (cursor !== undefined) {
1072
+ localVarQueryParameter['cursor'] = cursor;
1073
+ }
1074
+
1075
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
1076
+
1077
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
1078
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
1079
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
1080
+
1081
+ return {
1082
+ url: toPathString(localVarUrlObj),
1083
+ options: localVarRequestOptions,
1084
+ };
1085
+ },
1086
+ /**
1087
+ * 이 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
1088
+ * @summary 웹훅 구독 목록 조회
1089
+ * @param {*} [options] Override http request option.
1090
+ * @throws {RequiredError}
1091
+ */
1092
+ listWebhookEndpoints: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
1093
+ const localVarPath = `/v2/webhook-endpoints`;
1094
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
1095
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
1096
+ let baseOptions;
1097
+ if (configuration) {
1098
+ baseOptions = configuration.baseOptions;
1099
+ }
1100
+
1101
+ const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
1102
+ const localVarHeaderParameter = {} as any;
1103
+ const localVarQueryParameter = {} as any;
1104
+
1105
+ // authentication partner-oauth2 required
1106
+ // oauth required
1107
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:read"], configuration)
1108
+
1109
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
1110
+
1111
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
1112
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
1113
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
1114
+
1115
+ return {
1116
+ url: toPathString(localVarUrlObj),
1117
+ options: localVarRequestOptions,
1118
+ };
1119
+ },
883
1120
  /**
884
1121
  * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 후 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(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` 헤더 필수.
885
1122
  * @summary 유찰 처리
@@ -1166,6 +1403,94 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
1166
1403
  options: localVarRequestOptions,
1167
1404
  };
1168
1405
  },
1406
+ /**
1407
+ * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 이 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 수 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 새 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 를 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
1408
+ * @summary 웹훅 서명 시크릿 재발급
1409
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1410
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1411
+ * @param {*} [options] Override http request option.
1412
+ * @throws {RequiredError}
1413
+ */
1414
+ rotateWebhookSecret: async (endpointId: string, idempotencyKey: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
1415
+ // verify required parameter 'endpointId' is not null or undefined
1416
+ assertParamExists('rotateWebhookSecret', 'endpointId', endpointId)
1417
+ // verify required parameter 'idempotencyKey' is not null or undefined
1418
+ assertParamExists('rotateWebhookSecret', 'idempotencyKey', idempotencyKey)
1419
+ const localVarPath = `/v2/webhook-endpoints/{endpointId}/rotate-secret`
1420
+ .replace('{endpointId}', encodeURIComponent(String(endpointId)));
1421
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
1422
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
1423
+ let baseOptions;
1424
+ if (configuration) {
1425
+ baseOptions = configuration.baseOptions;
1426
+ }
1427
+
1428
+ const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
1429
+ const localVarHeaderParameter = {} as any;
1430
+ const localVarQueryParameter = {} as any;
1431
+
1432
+ // authentication partner-oauth2 required
1433
+ // oauth required
1434
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:write"], configuration)
1435
+
1436
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
1437
+
1438
+ if (idempotencyKey != null) {
1439
+ localVarHeaderParameter['Idempotency-Key'] = String(idempotencyKey);
1440
+ }
1441
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
1442
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
1443
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
1444
+
1445
+ return {
1446
+ url: toPathString(localVarUrlObj),
1447
+ options: localVarRequestOptions,
1448
+ };
1449
+ },
1450
+ /**
1451
+ * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 그 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` 에 `delivered: false` 로 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 은 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
1452
+ * @summary 웹훅 연결 확인 발송
1453
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1454
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1455
+ * @param {*} [options] Override http request option.
1456
+ * @throws {RequiredError}
1457
+ */
1458
+ sendWebhookTestEvent: async (endpointId: string, idempotencyKey: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
1459
+ // verify required parameter 'endpointId' is not null or undefined
1460
+ assertParamExists('sendWebhookTestEvent', 'endpointId', endpointId)
1461
+ // verify required parameter 'idempotencyKey' is not null or undefined
1462
+ assertParamExists('sendWebhookTestEvent', 'idempotencyKey', idempotencyKey)
1463
+ const localVarPath = `/v2/webhook-endpoints/{endpointId}/test`
1464
+ .replace('{endpointId}', encodeURIComponent(String(endpointId)));
1465
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
1466
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
1467
+ let baseOptions;
1468
+ if (configuration) {
1469
+ baseOptions = configuration.baseOptions;
1470
+ }
1471
+
1472
+ const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
1473
+ const localVarHeaderParameter = {} as any;
1474
+ const localVarQueryParameter = {} as any;
1475
+
1476
+ // authentication partner-oauth2 required
1477
+ // oauth required
1478
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:write"], configuration)
1479
+
1480
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
1481
+
1482
+ if (idempotencyKey != null) {
1483
+ localVarHeaderParameter['Idempotency-Key'] = String(idempotencyKey);
1484
+ }
1485
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
1486
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
1487
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
1488
+
1489
+ return {
1490
+ url: toPathString(localVarUrlObj),
1491
+ options: localVarRequestOptions,
1492
+ };
1493
+ },
1169
1494
  /**
1170
1495
  * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 면 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
1171
1496
  * @summary 협상 점수평가
@@ -1270,6 +1595,61 @@ export const PartnerApiApiAxiosParamCreator = function (configuration?: Configur
1270
1595
  options: localVarRequestOptions,
1271
1596
  };
1272
1597
  },
1598
+ /**
1599
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 는 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 가 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 이 헤더가 없으면 두 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` — 헤더를 빼먹었습니다. 조회 후 `ETag` 를 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** — 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1600
+ * @summary 웹훅 구독 수정
1601
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1602
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
1603
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1604
+ * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
1605
+ * @param {*} [options] Override http request option.
1606
+ * @throws {RequiredError}
1607
+ */
1608
+ updateWebhookEndpoint: async (endpointId: string, ifMatch: string, idempotencyKey: string, updateWebhookEndpointRequestDto: UpdateWebhookEndpointRequestDto, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
1609
+ // verify required parameter 'endpointId' is not null or undefined
1610
+ assertParamExists('updateWebhookEndpoint', 'endpointId', endpointId)
1611
+ // verify required parameter 'ifMatch' is not null or undefined
1612
+ assertParamExists('updateWebhookEndpoint', 'ifMatch', ifMatch)
1613
+ // verify required parameter 'idempotencyKey' is not null or undefined
1614
+ assertParamExists('updateWebhookEndpoint', 'idempotencyKey', idempotencyKey)
1615
+ // verify required parameter 'updateWebhookEndpointRequestDto' is not null or undefined
1616
+ assertParamExists('updateWebhookEndpoint', 'updateWebhookEndpointRequestDto', updateWebhookEndpointRequestDto)
1617
+ const localVarPath = `/v2/webhook-endpoints/{endpointId}`
1618
+ .replace('{endpointId}', encodeURIComponent(String(endpointId)));
1619
+ // use dummy base URL string because the URL constructor only accepts absolute URLs.
1620
+ const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
1621
+ let baseOptions;
1622
+ if (configuration) {
1623
+ baseOptions = configuration.baseOptions;
1624
+ }
1625
+
1626
+ const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options};
1627
+ const localVarHeaderParameter = {} as any;
1628
+ const localVarQueryParameter = {} as any;
1629
+
1630
+ // authentication partner-oauth2 required
1631
+ // oauth required
1632
+ await setOAuthToObject(localVarHeaderParameter, "partner-oauth2", ["webhooks:write"], configuration)
1633
+
1634
+ localVarHeaderParameter['Content-Type'] = 'application/json';
1635
+ localVarHeaderParameter['Accept'] = 'application/json,application/problem+json';
1636
+
1637
+ if (ifMatch != null) {
1638
+ localVarHeaderParameter['If-Match'] = String(ifMatch);
1639
+ }
1640
+ if (idempotencyKey != null) {
1641
+ localVarHeaderParameter['Idempotency-Key'] = String(idempotencyKey);
1642
+ }
1643
+ setSearchParams(localVarUrlObj, localVarQueryParameter);
1644
+ let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
1645
+ localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
1646
+ localVarRequestOptions.data = serializeDataIfNeeded(updateWebhookEndpointRequestDto, localVarRequestOptions, configuration)
1647
+
1648
+ return {
1649
+ url: toPathString(localVarUrlObj),
1650
+ options: localVarRequestOptions,
1651
+ };
1652
+ },
1273
1653
  /**
1274
1654
  * **첨부 업로드의 기본 경로입니다. 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` 헤더 필수.
1275
1655
  * @summary 공고 첨부파일 업로드 (기본)
@@ -1425,6 +1805,35 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1425
1805
  const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.createFileUploadUrl']?.[localVarOperationServerIndex]?.url;
1426
1806
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1427
1807
  },
1808
+ /**
1809
+ * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
1810
+ * @summary 웹훅 구독 등록
1811
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1812
+ * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
1813
+ * @param {*} [options] Override http request option.
1814
+ * @throws {RequiredError}
1815
+ */
1816
+ async createWebhookEndpoint(idempotencyKey: string, createWebhookEndpointRequestDto: CreateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<CreateWebhookEndpoint201Response>> {
1817
+ const localVarAxiosArgs = await localVarAxiosParamCreator.createWebhookEndpoint(idempotencyKey, createWebhookEndpointRequestDto, options);
1818
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
1819
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.createWebhookEndpoint']?.[localVarOperationServerIndex]?.url;
1820
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1821
+ },
1822
+ /**
1823
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH … {\"status\":\"DISABLED\"}` 를 쓰세요 — 시크릿과 이벤트 구성이 남아 그대로 되살릴 수 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 가 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` — 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
1824
+ * @summary 웹훅 구독 삭제
1825
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1826
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
1827
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
1828
+ * @param {*} [options] Override http request option.
1829
+ * @throws {RequiredError}
1830
+ */
1831
+ async deleteWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
1832
+ const localVarAxiosArgs = await localVarAxiosParamCreator.deleteWebhookEndpoint(endpointId, ifMatch, idempotencyKey, options);
1833
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
1834
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.deleteWebhookEndpoint']?.[localVarOperationServerIndex]?.url;
1835
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1836
+ },
1428
1837
  /**
1429
1838
  * 무인증 — `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` 이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
1430
1839
  * @summary 파일 다운로드
@@ -1517,6 +1926,19 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1517
1926
  const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.getSupplierCardPayableV2']?.[localVarOperationServerIndex]?.url;
1518
1927
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1519
1928
  },
1929
+ /**
1930
+ * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` 를 `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 — `endpointId` 를 확인하세요. **필수 스코프:** `webhooks:read`
1931
+ * @summary 웹훅 구독 단건 조회
1932
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
1933
+ * @param {*} [options] Override http request option.
1934
+ * @throws {RequiredError}
1935
+ */
1936
+ async getWebhookEndpoint(endpointId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetWebhookEndpoint200Response>> {
1937
+ const localVarAxiosArgs = await localVarAxiosParamCreator.getWebhookEndpoint(endpointId, options);
1938
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
1939
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.getWebhookEndpoint']?.[localVarOperationServerIndex]?.url;
1940
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1941
+ },
1520
1942
  /**
1521
1943
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
1522
1944
  * @summary Partner API 헬스체크
@@ -1543,7 +1965,7 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1543
1965
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1544
1966
  },
1545
1967
  /**
1546
- * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답의 `nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `nextCursor=null` 이면 마지막 페이지입니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
1968
+ * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `meta.hasMore` 가 `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
1547
1969
  * @summary 공고 목록 조회
1548
1970
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
1549
1971
  * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달한다. 미지정 시 첫 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
@@ -1573,6 +1995,34 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1573
1995
  const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.listExternalContractDocuments']?.[localVarOperationServerIndex]?.url;
1574
1996
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1575
1997
  },
1998
+ /**
1999
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 로 걸러 다시 처리하면 됩니다. - \"이벤트가 안 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 가 같고 `attempt` 만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 를 다음 요청의 `cursor` 로 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
2000
+ * @summary 웹훅 전송 이력 조회
2001
+ * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
2002
+ * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
2003
+ * @param {number} [limit] 페이지 크기(1~200, 기본 50).
2004
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달합니다. 미지정 시 첫 페이지.
2005
+ * @param {*} [options] Override http request option.
2006
+ * @throws {RequiredError}
2007
+ */
2008
+ async listWebhookDeliveries(endpointId?: string, status?: PartnerWebhookDeliveryStatus, limit?: number, cursor?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ListWebhookDeliveries200Response>> {
2009
+ const localVarAxiosArgs = await localVarAxiosParamCreator.listWebhookDeliveries(endpointId, status, limit, cursor, options);
2010
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
2011
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.listWebhookDeliveries']?.[localVarOperationServerIndex]?.url;
2012
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
2013
+ },
2014
+ /**
2015
+ * 이 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2016
+ * @summary 웹훅 구독 목록 조회
2017
+ * @param {*} [options] Override http request option.
2018
+ * @throws {RequiredError}
2019
+ */
2020
+ async listWebhookEndpoints(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ListWebhookEndpoints200Response>> {
2021
+ const localVarAxiosArgs = await localVarAxiosParamCreator.listWebhookEndpoints(options);
2022
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
2023
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.listWebhookEndpoints']?.[localVarOperationServerIndex]?.url;
2024
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
2025
+ },
1576
2026
  /**
1577
2027
  * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 후 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(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` 헤더 필수.
1578
2028
  * @summary 유찰 처리
@@ -1661,6 +2111,34 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1661
2111
  const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.revertAward']?.[localVarOperationServerIndex]?.url;
1662
2112
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1663
2113
  },
2114
+ /**
2115
+ * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 이 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 수 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 새 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 를 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
2116
+ * @summary 웹훅 서명 시크릿 재발급
2117
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2118
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2119
+ * @param {*} [options] Override http request option.
2120
+ * @throws {RequiredError}
2121
+ */
2122
+ async rotateWebhookSecret(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<CreateWebhookEndpoint201Response>> {
2123
+ const localVarAxiosArgs = await localVarAxiosParamCreator.rotateWebhookSecret(endpointId, idempotencyKey, options);
2124
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
2125
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.rotateWebhookSecret']?.[localVarOperationServerIndex]?.url;
2126
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
2127
+ },
2128
+ /**
2129
+ * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 그 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` 에 `delivered: false` 로 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 은 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
2130
+ * @summary 웹훅 연결 확인 발송
2131
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2132
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2133
+ * @param {*} [options] Override http request option.
2134
+ * @throws {RequiredError}
2135
+ */
2136
+ async sendWebhookTestEvent(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<SendWebhookTestEvent200Response>> {
2137
+ const localVarAxiosArgs = await localVarAxiosParamCreator.sendWebhookTestEvent(endpointId, idempotencyKey, options);
2138
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
2139
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.sendWebhookTestEvent']?.[localVarOperationServerIndex]?.url;
2140
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
2141
+ },
1664
2142
  /**
1665
2143
  * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 면 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
1666
2144
  * @summary 협상 점수평가
@@ -1692,6 +2170,22 @@ export const PartnerApiApiFp = function(configuration?: Configuration) {
1692
2170
  const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.updateBid']?.[localVarOperationServerIndex]?.url;
1693
2171
  return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
1694
2172
  },
2173
+ /**
2174
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 는 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 가 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 이 헤더가 없으면 두 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` — 헤더를 빼먹었습니다. 조회 후 `ETag` 를 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** — 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2175
+ * @summary 웹훅 구독 수정
2176
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2177
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2178
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2179
+ * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
2180
+ * @param {*} [options] Override http request option.
2181
+ * @throws {RequiredError}
2182
+ */
2183
+ async updateWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, updateWebhookEndpointRequestDto: UpdateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<GetWebhookEndpoint200Response>> {
2184
+ const localVarAxiosArgs = await localVarAxiosParamCreator.updateWebhookEndpoint(endpointId, ifMatch, idempotencyKey, updateWebhookEndpointRequestDto, options);
2185
+ const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
2186
+ const localVarOperationServerBasePath = operationServerMap['PartnerApiApi.updateWebhookEndpoint']?.[localVarOperationServerIndex]?.url;
2187
+ return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
2188
+ },
1695
2189
  /**
1696
2190
  * **첨부 업로드의 기본 경로입니다. 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` 헤더 필수.
1697
2191
  * @summary 공고 첨부파일 업로드 (기본)
@@ -1795,6 +2289,29 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
1795
2289
  createFileUploadUrl(idempotencyKey: string, createUploadUrlRequestDto: CreateUploadUrlRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<CreateFileUploadUrl201Response> {
1796
2290
  return localVarFp.createFileUploadUrl(idempotencyKey, createUploadUrlRequestDto, options).then((request) => request(axios, basePath));
1797
2291
  },
2292
+ /**
2293
+ * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2294
+ * @summary 웹훅 구독 등록
2295
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2296
+ * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
2297
+ * @param {*} [options] Override http request option.
2298
+ * @throws {RequiredError}
2299
+ */
2300
+ createWebhookEndpoint(idempotencyKey: string, createWebhookEndpointRequestDto: CreateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<CreateWebhookEndpoint201Response> {
2301
+ return localVarFp.createWebhookEndpoint(idempotencyKey, createWebhookEndpointRequestDto, options).then((request) => request(axios, basePath));
2302
+ },
2303
+ /**
2304
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH … {\"status\":\"DISABLED\"}` 를 쓰세요 — 시크릿과 이벤트 구성이 남아 그대로 되살릴 수 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 가 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` — 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2305
+ * @summary 웹훅 구독 삭제
2306
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2307
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2308
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2309
+ * @param {*} [options] Override http request option.
2310
+ * @throws {RequiredError}
2311
+ */
2312
+ deleteWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, options?: RawAxiosRequestConfig): AxiosPromise<void> {
2313
+ return localVarFp.deleteWebhookEndpoint(endpointId, ifMatch, idempotencyKey, options).then((request) => request(axios, basePath));
2314
+ },
1798
2315
  /**
1799
2316
  * 무인증 — `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` 이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
1800
2317
  * @summary 파일 다운로드
@@ -1866,6 +2383,16 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
1866
2383
  getSupplierCardPayableV2(memberId: string, options?: RawAxiosRequestConfig): AxiosPromise<GetSupplierCardPayableV2200Response> {
1867
2384
  return localVarFp.getSupplierCardPayableV2(memberId, options).then((request) => request(axios, basePath));
1868
2385
  },
2386
+ /**
2387
+ * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` 를 `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 — `endpointId` 를 확인하세요. **필수 스코프:** `webhooks:read`
2388
+ * @summary 웹훅 구독 단건 조회
2389
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2390
+ * @param {*} [options] Override http request option.
2391
+ * @throws {RequiredError}
2392
+ */
2393
+ getWebhookEndpoint(endpointId: string, options?: RawAxiosRequestConfig): AxiosPromise<GetWebhookEndpoint200Response> {
2394
+ return localVarFp.getWebhookEndpoint(endpointId, options).then((request) => request(axios, basePath));
2395
+ },
1869
2396
  /**
1870
2397
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
1871
2398
  * @summary Partner API 헬스체크
@@ -1886,7 +2413,7 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
1886
2413
  return localVarFp.listBidResults(bidRefs, options).then((request) => request(axios, basePath));
1887
2414
  },
1888
2415
  /**
1889
- * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답의 `nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `nextCursor=null` 이면 마지막 페이지입니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
2416
+ * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `meta.hasMore` 가 `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
1890
2417
  * @summary 공고 목록 조회
1891
2418
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
1892
2419
  * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달한다. 미지정 시 첫 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
@@ -1910,6 +2437,28 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
1910
2437
  listExternalContractDocuments(buyerId: string, bidType: ListExternalContractDocumentsBidTypeEnum, options?: RawAxiosRequestConfig): AxiosPromise<ExternalContractDocumentsResponseDto> {
1911
2438
  return localVarFp.listExternalContractDocuments(buyerId, bidType, options).then((request) => request(axios, basePath));
1912
2439
  },
2440
+ /**
2441
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 로 걸러 다시 처리하면 됩니다. - \"이벤트가 안 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 가 같고 `attempt` 만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 를 다음 요청의 `cursor` 로 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
2442
+ * @summary 웹훅 전송 이력 조회
2443
+ * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
2444
+ * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
2445
+ * @param {number} [limit] 페이지 크기(1~200, 기본 50).
2446
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달합니다. 미지정 시 첫 페이지.
2447
+ * @param {*} [options] Override http request option.
2448
+ * @throws {RequiredError}
2449
+ */
2450
+ listWebhookDeliveries(endpointId?: string, status?: PartnerWebhookDeliveryStatus, limit?: number, cursor?: string, options?: RawAxiosRequestConfig): AxiosPromise<ListWebhookDeliveries200Response> {
2451
+ return localVarFp.listWebhookDeliveries(endpointId, status, limit, cursor, options).then((request) => request(axios, basePath));
2452
+ },
2453
+ /**
2454
+ * 이 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2455
+ * @summary 웹훅 구독 목록 조회
2456
+ * @param {*} [options] Override http request option.
2457
+ * @throws {RequiredError}
2458
+ */
2459
+ listWebhookEndpoints(options?: RawAxiosRequestConfig): AxiosPromise<ListWebhookEndpoints200Response> {
2460
+ return localVarFp.listWebhookEndpoints(options).then((request) => request(axios, basePath));
2461
+ },
1913
2462
  /**
1914
2463
  * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 후 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(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` 헤더 필수.
1915
2464
  * @summary 유찰 처리
@@ -1980,6 +2529,28 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
1980
2529
  revertAward(bidRef: string, idempotencyKey: string, revertAwardRequestDto: RevertAwardRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<RevertAward200Response> {
1981
2530
  return localVarFp.revertAward(bidRef, idempotencyKey, revertAwardRequestDto, options).then((request) => request(axios, basePath));
1982
2531
  },
2532
+ /**
2533
+ * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 이 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 수 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 새 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 를 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
2534
+ * @summary 웹훅 서명 시크릿 재발급
2535
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2536
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2537
+ * @param {*} [options] Override http request option.
2538
+ * @throws {RequiredError}
2539
+ */
2540
+ rotateWebhookSecret(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig): AxiosPromise<CreateWebhookEndpoint201Response> {
2541
+ return localVarFp.rotateWebhookSecret(endpointId, idempotencyKey, options).then((request) => request(axios, basePath));
2542
+ },
2543
+ /**
2544
+ * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 그 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` 에 `delivered: false` 로 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 은 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
2545
+ * @summary 웹훅 연결 확인 발송
2546
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2547
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2548
+ * @param {*} [options] Override http request option.
2549
+ * @throws {RequiredError}
2550
+ */
2551
+ sendWebhookTestEvent(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig): AxiosPromise<SendWebhookTestEvent200Response> {
2552
+ return localVarFp.sendWebhookTestEvent(endpointId, idempotencyKey, options).then((request) => request(axios, basePath));
2553
+ },
1983
2554
  /**
1984
2555
  * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 면 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
1985
2556
  * @summary 협상 점수평가
@@ -2005,6 +2576,19 @@ export const PartnerApiApiFactory = function (configuration?: Configuration, bas
2005
2576
  updateBid(bidRef: string, ifMatch: string, idempotencyKey: string, updateBidRequestDto: UpdateBidRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<UpdateBid200Response> {
2006
2577
  return localVarFp.updateBid(bidRef, ifMatch, idempotencyKey, updateBidRequestDto, options).then((request) => request(axios, basePath));
2007
2578
  },
2579
+ /**
2580
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 는 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 가 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 이 헤더가 없으면 두 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` — 헤더를 빼먹었습니다. 조회 후 `ETag` 를 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** — 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2581
+ * @summary 웹훅 구독 수정
2582
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2583
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2584
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2585
+ * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
2586
+ * @param {*} [options] Override http request option.
2587
+ * @throws {RequiredError}
2588
+ */
2589
+ updateWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, updateWebhookEndpointRequestDto: UpdateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<GetWebhookEndpoint200Response> {
2590
+ return localVarFp.updateWebhookEndpoint(endpointId, ifMatch, idempotencyKey, updateWebhookEndpointRequestDto, options).then((request) => request(axios, basePath));
2591
+ },
2008
2592
  /**
2009
2593
  * **첨부 업로드의 기본 경로입니다. 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` 헤더 필수.
2010
2594
  * @summary 공고 첨부파일 업로드 (기본)
@@ -2110,6 +2694,31 @@ export class PartnerApiApi extends BaseAPI {
2110
2694
  return PartnerApiApiFp(this.configuration).createFileUploadUrl(idempotencyKey, createUploadUrlRequestDto, options).then((request) => request(this.axios, this.basePath));
2111
2695
  }
2112
2696
 
2697
+ /**
2698
+ * 수신 주소와 구독할 이벤트를 등록합니다. **호출 시점:** 연동 초기 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2699
+ * @summary 웹훅 구독 등록
2700
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2701
+ * @param {CreateWebhookEndpointRequestDto} createWebhookEndpointRequestDto
2702
+ * @param {*} [options] Override http request option.
2703
+ * @throws {RequiredError}
2704
+ */
2705
+ public createWebhookEndpoint(idempotencyKey: string, createWebhookEndpointRequestDto: CreateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig) {
2706
+ return PartnerApiApiFp(this.configuration).createWebhookEndpoint(idempotencyKey, createWebhookEndpointRequestDto, options).then((request) => request(this.axios, this.basePath));
2707
+ }
2708
+
2709
+ /**
2710
+ * 구독을 삭제합니다. 이후 그 주소로는 아무 이벤트도 발송되지 않습니다. **호출 시점:** 연동을 종료할 때. 잠시만 멈추려면 삭제하지 말고 `PATCH … {\"status\":\"DISABLED\"}` 를 쓰세요 — 시크릿과 이벤트 구성이 남아 그대로 되살릴 수 있습니다. **되돌릴 수 없습니다.** 다시 등록하면 새 구독이고 서명 시크릿도 새 값입니다. **`If-Match` 가 필수입니다.** `GET` 으로 받은 `ETag` 를 실어 보내세요. - `428` — 헤더 누락. 조회 후 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다(누군가 수정했거나 발송기가 상태를 내렸습니다). 다시 조회해 정말 지울 대상이 맞는지 확인하고 최신 `ETag` 로 재시도하세요. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
2711
+ * @summary 웹훅 구독 삭제
2712
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2713
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
2714
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2715
+ * @param {*} [options] Override http request option.
2716
+ * @throws {RequiredError}
2717
+ */
2718
+ public deleteWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, options?: RawAxiosRequestConfig) {
2719
+ return PartnerApiApiFp(this.configuration).deleteWebhookEndpoint(endpointId, ifMatch, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2720
+ }
2721
+
2113
2722
  /**
2114
2723
  * 무인증 — `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` 이 가리키는 주소라 계속 유지되며 중단 일정은 없습니다.
2115
2724
  * @summary 파일 다운로드
@@ -2188,6 +2797,17 @@ export class PartnerApiApi extends BaseAPI {
2188
2797
  return PartnerApiApiFp(this.configuration).getSupplierCardPayableV2(memberId, options).then((request) => request(this.axios, this.basePath));
2189
2798
  }
2190
2799
 
2800
+ /**
2801
+ * 구독 1건의 현재 상태를 조회합니다. 서명 시크릿은 실리지 않습니다. **수정·삭제 전에 먼저 호출하세요.** 응답 헤더 `ETag` 를 `If-Match` 에 그대로 실어야 `PATCH`/`DELETE` 가 통과합니다. **`404`:** 없는 구독이거나 다른 파트너 키의 구독입니다 — `endpointId` 를 확인하세요. **필수 스코프:** `webhooks:read`
2802
+ * @summary 웹훅 구독 단건 조회
2803
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2804
+ * @param {*} [options] Override http request option.
2805
+ * @throws {RequiredError}
2806
+ */
2807
+ public getWebhookEndpoint(endpointId: string, options?: RawAxiosRequestConfig) {
2808
+ return PartnerApiApiFp(this.configuration).getWebhookEndpoint(endpointId, options).then((request) => request(this.axios, this.basePath));
2809
+ }
2810
+
2191
2811
  /**
2192
2812
  * ERP 연동 직전 회선·인증 endpoint 동작 확인용.
2193
2813
  * @summary Partner API 헬스체크
@@ -2210,7 +2830,7 @@ export class PartnerApiApi extends BaseAPI {
2210
2830
  }
2211
2831
 
2212
2832
  /**
2213
- * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답의 `nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `nextCursor=null` 이면 마지막 페이지입니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
2833
+ * 발주처(API 키 바인딩)의 공고를 게시일 최신순으로 조회합니다. 스코프 `bids:read`. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(쿼리에 buyerId 를 넣지 않습니다). **페이지네이션(cursor):** `limit`(1~100, 기본 100) + `cursor`(불투명 토큰). 응답 `meta.nextCursor` 를 다음 요청 `cursor` 로 전달하면 다음 페이지를 받습니다. `meta.hasMore` 가 `false`(= `nextCursor` 가 `null`)이면 마지막 페이지입니다. 목록 자체는 `data` 에 배열로 실립니다. **상태·낙찰방법:** 공개값(의미 문자열)으로 반환됩니다. 낙찰 여부는 상태가 아니라 낙찰 결과 조회의 `participants[].isWinner` 로 관측합니다(AWARDED 상태는 없습니다).
2214
2834
  * @summary 공고 목록 조회
2215
2835
  * @param {number} [limit] 페이지 크기(1~100, 기본 100).
2216
2836
  * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달한다. 미지정 시 첫 페이지. &#x60;nextCursor&#x3D;null&#x60; 이면 마지막 페이지다.
@@ -2236,6 +2856,30 @@ export class PartnerApiApi extends BaseAPI {
2236
2856
  return PartnerApiApiFp(this.configuration).listExternalContractDocuments(buyerId, bidType, options).then((request) => request(this.axios, this.basePath));
2237
2857
  }
2238
2858
 
2859
+ /**
2860
+ * 이 API 키의 웹훅 발송 시도를 최신순으로 조회합니다. 보낸 본문·수신측 응답 상태· 다음 재시도 예정 시각이 함께 실립니다. **호출 시점:** - 수신측 장애로 놓친 이벤트를 메울 때. 이 엔드포인트가 웹훅의 **폴링 대체 경로**입니다 — `status=EXHAUSTED` 로 걸러 다시 처리하면 됩니다. - \"이벤트가 안 온다\" 를 진단할 때. 발송 시도 자체가 없는지(구독·이벤트 타입 문제), 시도했지만 실패했는지(`responseStatus`·`responseBodyExcerpt`)를 여기서 가릅니다. **같은 이벤트가 여러 행으로 보입니다.** 재시도마다 한 행이며 `eventId` 가 같고 `attempt` 만 올라갑니다. 처리 여부는 `eventId` 기준으로 판단하세요. **페이지네이션:** `nextCursor` 를 다음 요청의 `cursor` 로 전달합니다. null 이면 마지막 페이지입니다. **`400`:** `status` 가 허용 값 밖이거나 `limit` 이 범위를 벗어났습니다 — 값을 고쳐 재시도하세요. **필수 스코프:** `webhooks:read`
2861
+ * @summary 웹훅 전송 이력 조회
2862
+ * @param {string} [endpointId] 이 구독의 전송만 조회합니다. 미지정이면 이 키의 모든 구독을 함께 조회합니다.
2863
+ * @param {PartnerWebhookDeliveryStatus} [status] 전송 상태 필터. 미지정이면 전부.
2864
+ * @param {number} [limit] 페이지 크기(1~200, 기본 50).
2865
+ * @param {string} [cursor] 다음 페이지 커서(불투명 토큰). 직전 응답의 &#x60;nextCursor&#x60; 를 그대로 전달합니다. 미지정 시 첫 페이지.
2866
+ * @param {*} [options] Override http request option.
2867
+ * @throws {RequiredError}
2868
+ */
2869
+ public listWebhookDeliveries(endpointId?: string, status?: PartnerWebhookDeliveryStatus, limit?: number, cursor?: string, options?: RawAxiosRequestConfig) {
2870
+ return PartnerApiApiFp(this.configuration).listWebhookDeliveries(endpointId, status, limit, cursor, options).then((request) => request(this.axios, this.basePath));
2871
+ }
2872
+
2873
+ /**
2874
+ * 이 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` 가 발송 시도 이력(본문·응답 상태·다음 재시도 시각)을 돌려줍니다. 수신측 장애 구간을 메울 때 이 엔드포인트를 폴링 대체 경로로 쓰세요.
2875
+ * @summary 웹훅 구독 목록 조회
2876
+ * @param {*} [options] Override http request option.
2877
+ * @throws {RequiredError}
2878
+ */
2879
+ public listWebhookEndpoints(options?: RawAxiosRequestConfig) {
2880
+ return PartnerApiApiFp(this.configuration).listWebhookEndpoints(options).then((request) => request(this.axios, this.basePath));
2881
+ }
2882
+
2239
2883
  /**
2240
2884
  * 공고를 유찰 상태로 전환합니다. **호출 시점:** 입찰 마감 후 유찰 사유가 확정되었을 때. 공고가 입찰완료(마감) 상태에서 호출합니다. **부수효과:** - 공고 상태가 유찰(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` 헤더 필수.
2241
2885
  * @summary 유찰 처리
@@ -2312,6 +2956,30 @@ export class PartnerApiApi extends BaseAPI {
2312
2956
  return PartnerApiApiFp(this.configuration).revertAward(bidRef, idempotencyKey, revertAwardRequestDto, options).then((request) => request(this.axios, this.basePath));
2313
2957
  }
2314
2958
 
2959
+ /**
2960
+ * 서명 시크릿을 새로 발급합니다. 응답의 `secretVersion` 이 1 올라갑니다. **호출 시점:** 시크릿을 분실했거나 유출이 의심될 때, 또는 주기적 교체 정책이 있을 때. **새 시크릿은 이 응답에서 한 번만 나갑니다.** 조회로 다시 받을 수 없습니다. **옛 시크릿은 즉시 무효입니다.** 유예 기간이 없으므로, 수신측이 새 값을 반영하기 전에 도착한 이벤트는 서명 검증에 실패합니다. 배포 순서를 이렇게 잡으세요 — ① 수신측이 옛 값과 새 값을 **둘 다** 받아들이도록 배포 → ② 이 엔드포인트 호출 → ③ 응답의 새 값을 반영 → ④ 옛 값 제거. 검증 실패로 non-2xx 를 돌려주면 실패로 집계되어 20회 연속 시 구독이 중지됩니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 같은 키로 재전송하면 **새로 발급하지 않고** 처음 발급한 값을 그대로 돌려줍니다(24시간) — 네트워크 오류로 응답을 놓쳤을 때 같은 키로 다시 부르세요.
2961
+ * @summary 웹훅 서명 시크릿 재발급
2962
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2963
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2964
+ * @param {*} [options] Override http request option.
2965
+ * @throws {RequiredError}
2966
+ */
2967
+ public rotateWebhookSecret(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig) {
2968
+ return PartnerApiApiFp(this.configuration).rotateWebhookSecret(endpointId, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2969
+ }
2970
+
2971
+ /**
2972
+ * 등록된 주소로 `ping` 이벤트를 즉시 1회 보내고 그 결과를 돌려줍니다. **호출 시점:** 구독을 등록한 직후, 수신 주소를 바꾼 직후, 방화벽·인증서를 손본 뒤. **응답은 발송 결과이지 요청 실패가 아닙니다.** 수신측이 받지 못해도 HTTP `200` 에 `delivered: false` 로 옵니다 — `responseStatus`(수신측 상태)와 `error`(연결 거부·타임아웃· TLS 오류)를 보고 원인을 좁히세요. 이 발송에도 실제 이벤트와 **똑같은 서명 헤더**가 실리므로 검증 코드를 그대로 시험할 수 있습니다. `ping` 은 구독 목록에 넣을 수 없는 타입이니, 수신측이 모르는 `eventType` 을 만나면 버리도록 짜여 있다면 이 확인만 실패할 수 있습니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수. 다시 보내려면 **새 키**를 쓰세요 — 같은 키는 24시간 동안 직전 결과를 그대로 돌려줍니다(재발송하지 않습니다).
2973
+ * @summary 웹훅 연결 확인 발송
2974
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
2975
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
2976
+ * @param {*} [options] Override http request option.
2977
+ * @throws {RequiredError}
2978
+ */
2979
+ public sendWebhookTestEvent(endpointId: string, idempotencyKey: string, options?: RawAxiosRequestConfig) {
2980
+ return PartnerApiApiFp(this.configuration).sendWebhookTestEvent(endpointId, idempotencyKey, options).then((request) => request(this.axios, this.basePath));
2981
+ }
2982
+
2315
2983
  /**
2316
2984
  * 협상방식(NEGOTIATION/NEGOTIATION_AUTO) 공고의 응찰자별 점수를 입력합니다. **호출 시점:** 입찰 마감 후 낙찰(`POST /v2/bids/{bidRef}/award`) 전. 협상방식 공고는 이 평가를 완료해야 낙찰에 진입할 수 있습니다. **부수효과:** - 응찰자별 기술점수(및 선택적 가격점수 override)가 기록됩니다. - `complete=true` 면 평가완료 게이트까지 적용돼 낙찰 진입이 가능해집니다. **발주처:** API 키에 바인딩된 발주처로 자동 스코프됩니다(요청 body 에 buyerId 를 넣지 않습니다). **필수 스코프:** `awards:write` **멱등성:** `Idempotency-Key` 헤더 필수. 동일 키 + 동일 body 재전송 시 24시간 내 캐시 응답 반환.
2317
2985
  * @summary 협상 점수평가
@@ -2339,6 +3007,20 @@ export class PartnerApiApi extends BaseAPI {
2339
3007
  return PartnerApiApiFp(this.configuration).updateBid(bidRef, ifMatch, idempotencyKey, updateBidRequestDto, options).then((request) => request(this.axios, this.basePath));
2340
3008
  }
2341
3009
 
3010
+ /**
3011
+ * 수신 주소·구독 이벤트·상태를 수정합니다. 보낸 필드만 바뀝니다. **호출 시점:** 수신 주소가 바뀌었을 때, 구독 이벤트를 늘리거나 줄일 때, 연속 실패로 자동 중지된 구독을 고친 뒤 되살릴 때(`{\"status\":\"ACTIVE\"}`). **`eventTypes` 는 치환입니다** — 보낸 목록이 곧 새 구독 목록입니다. 하나를 더하려면 기존 목록에 더한 **전체**를 보내세요. **`If-Match` 가 필수입니다.** 먼저 `GET /v2/webhook-endpoints/{endpointId}` 로 현재 `ETag` 를 받아 그대로 실어 보내세요. 이 헤더가 없으면 두 요청이 앞서거니 뒤서거니 하며 먼저 한 수정을 조용히 덮어씁니다. - `428` — 헤더를 빼먹었습니다. 조회 후 `ETag` 를 실어 재시도하세요. - `412` — 그 사이 구독이 바뀌었습니다. 다시 조회해 최신 `ETag` 로 재시도하세요. 아무것도 수정되지 않았습니다. **시크릿은 이 경로로 바뀌지 않습니다** — 재발급은 `rotate-secret` 입니다. **필수 스코프:** `webhooks:write` **멱등성:** `Idempotency-Key` 헤더 필수.
3012
+ * @summary 웹훅 구독 수정
3013
+ * @param {string} endpointId 구독 식별자(등록 응답의 &#x60;endpointId&#x60;).
3014
+ * @param {string} ifMatch 직전 조회 응답의 &#x60;ETag&#x60; 값. 누락하면 428, 그 사이 구독이 바뀌었으면 412 로 거절되며 아무것도 변경되지 않습니다.
3015
+ * @param {string} idempotencyKey 멱등성 키(1~255자, &#x60;[A-Za-z0-9_-]&#x60;). **재시도할 때 처음과 같은 키를 다시 보내야** 중복 생성이 막힙니다 — 타임아웃·네트워크 오류로 다시 부르면서 새 키를 만들면 별개 요청으로 처리됩니다. 그래서 키는 UUID v4 를 만들어 **연동 시스템 원장에 저장**하거나, 요청 내용에서 결정적으로 파생(예: &#x60;bid-create-{구매번호}&#x60;)해 재시도가 같은 값을 재현하도록 하세요. 같은 키 + 같은 body 는 24시간 동안 캐시된 응답을 그대로 돌려줍니다.
3016
+ * @param {UpdateWebhookEndpointRequestDto} updateWebhookEndpointRequestDto
3017
+ * @param {*} [options] Override http request option.
3018
+ * @throws {RequiredError}
3019
+ */
3020
+ public updateWebhookEndpoint(endpointId: string, ifMatch: string, idempotencyKey: string, updateWebhookEndpointRequestDto: UpdateWebhookEndpointRequestDto, options?: RawAxiosRequestConfig) {
3021
+ return PartnerApiApiFp(this.configuration).updateWebhookEndpoint(endpointId, ifMatch, idempotencyKey, updateWebhookEndpointRequestDto, options).then((request) => request(this.axios, this.basePath));
3022
+ }
3023
+
2342
3024
  /**
2343
3025
  * **첨부 업로드의 기본 경로입니다. 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` 헤더 필수.
2344
3026
  * @summary 공고 첨부파일 업로드 (기본)