@cmarket/partner-sdk 50.2.0 β†’ 50.3.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 (698) hide show
  1. package/README.md +5 -5
  2. package/api/embed-api.ts +1 -1
  3. package/api/oauth-api.ts +5 -5
  4. package/api/partner-api-api.ts +1 -1
  5. package/api/products-api.ts +1 -1
  6. package/api/well-known-api.ts +1 -1
  7. package/api.ts +1 -1
  8. package/base.ts +1 -1
  9. package/common.ts +1 -1
  10. package/configuration.ts +1 -1
  11. package/dist/api/embed-api.d.ts +1 -1
  12. package/dist/api/embed-api.js +1 -1
  13. package/dist/api/oauth-api.d.ts +5 -5
  14. package/dist/api/oauth-api.js +5 -5
  15. package/dist/api/partner-api-api.d.ts +1 -1
  16. package/dist/api/partner-api-api.js +1 -1
  17. package/dist/api/products-api.d.ts +1 -1
  18. package/dist/api/products-api.js +1 -1
  19. package/dist/api/well-known-api.d.ts +1 -1
  20. package/dist/api/well-known-api.js +1 -1
  21. package/dist/api.d.ts +1 -1
  22. package/dist/api.js +1 -1
  23. package/dist/base.d.ts +1 -1
  24. package/dist/base.js +1 -1
  25. package/dist/common.d.ts +1 -1
  26. package/dist/common.js +1 -1
  27. package/dist/configuration.d.ts +1 -1
  28. package/dist/configuration.js +1 -1
  29. package/dist/esm/api/embed-api.d.ts +1 -1
  30. package/dist/esm/api/embed-api.js +1 -1
  31. package/dist/esm/api/oauth-api.d.ts +5 -5
  32. package/dist/esm/api/oauth-api.js +5 -5
  33. package/dist/esm/api/partner-api-api.d.ts +1 -1
  34. package/dist/esm/api/partner-api-api.js +1 -1
  35. package/dist/esm/api/products-api.d.ts +1 -1
  36. package/dist/esm/api/products-api.js +1 -1
  37. package/dist/esm/api/well-known-api.d.ts +1 -1
  38. package/dist/esm/api/well-known-api.js +1 -1
  39. package/dist/esm/api.d.ts +1 -1
  40. package/dist/esm/api.js +1 -1
  41. package/dist/esm/base.d.ts +1 -1
  42. package/dist/esm/base.js +1 -1
  43. package/dist/esm/common.d.ts +1 -1
  44. package/dist/esm/common.js +1 -1
  45. package/dist/esm/configuration.d.ts +1 -1
  46. package/dist/esm/configuration.js +1 -1
  47. package/dist/esm/index.d.ts +1 -1
  48. package/dist/esm/index.js +1 -1
  49. package/dist/esm/models/acceptance-result-response-dto.d.ts +1 -1
  50. package/dist/esm/models/acceptance-result-response-dto.js +1 -1
  51. package/dist/esm/models/acknowledge-product-receipt200-response.d.ts +1 -1
  52. package/dist/esm/models/acknowledge-product-receipt200-response.js +1 -1
  53. package/dist/esm/models/acknowledge-products-request-dto.d.ts +1 -1
  54. package/dist/esm/models/acknowledge-products-request-dto.js +1 -1
  55. package/dist/esm/models/api-catalog-dto.d.ts +1 -1
  56. package/dist/esm/models/api-catalog-dto.js +1 -1
  57. package/dist/esm/models/api-catalog-entry-dto.d.ts +1 -1
  58. package/dist/esm/models/api-catalog-entry-dto.js +1 -1
  59. package/dist/esm/models/api-catalog-link-dto.d.ts +1 -1
  60. package/dist/esm/models/api-catalog-link-dto.js +1 -1
  61. package/dist/esm/models/authorization-server-metadata-dto.d.ts +1 -1
  62. package/dist/esm/models/authorization-server-metadata-dto.js +1 -1
  63. package/dist/esm/models/avalues-input-dto.d.ts +1 -1
  64. package/dist/esm/models/avalues-input-dto.js +1 -1
  65. package/dist/esm/models/award-method-public.d.ts +1 -1
  66. package/dist/esm/models/award-method-public.js +1 -1
  67. package/dist/esm/models/award-registered-v2-response-dto.d.ts +1 -1
  68. package/dist/esm/models/award-registered-v2-response-dto.js +1 -1
  69. package/dist/esm/models/bid-acceptance-dto.d.ts +1 -1
  70. package/dist/esm/models/bid-acceptance-dto.js +1 -1
  71. package/dist/esm/models/bid-attachment-dto.d.ts +1 -1
  72. package/dist/esm/models/bid-attachment-dto.js +1 -1
  73. package/dist/esm/models/bid-attachment-input-dto.d.ts +1 -1
  74. package/dist/esm/models/bid-attachment-input-dto.js +1 -1
  75. package/dist/esm/models/bid-avalues-dto.d.ts +1 -1
  76. package/dist/esm/models/bid-avalues-dto.js +1 -1
  77. package/dist/esm/models/bid-award-method-detail-dto.d.ts +1 -1
  78. package/dist/esm/models/bid-award-method-detail-dto.js +1 -1
  79. package/dist/esm/models/bid-bond-dto.d.ts +1 -1
  80. package/dist/esm/models/bid-bond-dto.js +1 -1
  81. package/dist/esm/models/bid-cancellation-dto.d.ts +1 -1
  82. package/dist/esm/models/bid-cancellation-dto.js +1 -1
  83. package/dist/esm/models/bid-category-public.d.ts +1 -1
  84. package/dist/esm/models/bid-category-public.js +1 -1
  85. package/dist/esm/models/bid-contact-dto.d.ts +1 -1
  86. package/dist/esm/models/bid-contact-dto.js +1 -1
  87. package/dist/esm/models/bid-contacts-dto.d.ts +1 -1
  88. package/dist/esm/models/bid-contacts-dto.js +1 -1
  89. package/dist/esm/models/bid-contract-document-dto.d.ts +1 -1
  90. package/dist/esm/models/bid-contract-document-dto.js +1 -1
  91. package/dist/esm/models/bid-delivery-terms-dto.d.ts +1 -1
  92. package/dist/esm/models/bid-delivery-terms-dto.js +1 -1
  93. package/dist/esm/models/bid-detail-response-dto.d.ts +1 -1
  94. package/dist/esm/models/bid-detail-response-dto.js +1 -1
  95. package/dist/esm/models/bid-document-dto.d.ts +1 -1
  96. package/dist/esm/models/bid-document-dto.js +1 -1
  97. package/dist/esm/models/bid-failed-v2-response-dto.d.ts +1 -1
  98. package/dist/esm/models/bid-failed-v2-response-dto.js +1 -1
  99. package/dist/esm/models/bid-item-dto.d.ts +1 -1
  100. package/dist/esm/models/bid-item-dto.js +1 -1
  101. package/dist/esm/models/bid-license-requirement-dto.d.ts +1 -1
  102. package/dist/esm/models/bid-license-requirement-dto.js +1 -1
  103. package/dist/esm/models/bid-lifecycle-dto.d.ts +1 -1
  104. package/dist/esm/models/bid-lifecycle-dto.js +1 -1
  105. package/dist/esm/models/bid-manager-dto.d.ts +1 -1
  106. package/dist/esm/models/bid-manager-dto.js +1 -1
  107. package/dist/esm/models/bid-must-read-notice-dto.d.ts +1 -1
  108. package/dist/esm/models/bid-must-read-notice-dto.js +1 -1
  109. package/dist/esm/models/bid-payment-terms-dto.d.ts +1 -1
  110. package/dist/esm/models/bid-payment-terms-dto.js +1 -1
  111. package/dist/esm/models/bid-preliminary-price-dto.d.ts +1 -1
  112. package/dist/esm/models/bid-preliminary-price-dto.js +1 -1
  113. package/dist/esm/models/bid-preliminary-price-slot-dto.d.ts +1 -1
  114. package/dist/esm/models/bid-preliminary-price-slot-dto.js +1 -1
  115. package/dist/esm/models/bid-product-dto.d.ts +1 -1
  116. package/dist/esm/models/bid-product-dto.js +1 -1
  117. package/dist/esm/models/bid-public-status.d.ts +1 -1
  118. package/dist/esm/models/bid-public-status.js +1 -1
  119. package/dist/esm/models/bid-qualification-review-dto.d.ts +1 -1
  120. package/dist/esm/models/bid-qualification-review-dto.js +1 -1
  121. package/dist/esm/models/bid-region-dto.d.ts +1 -1
  122. package/dist/esm/models/bid-region-dto.js +1 -1
  123. package/dist/esm/models/bid-region-restriction-dto.d.ts +1 -1
  124. package/dist/esm/models/bid-region-restriction-dto.js +1 -1
  125. package/dist/esm/models/bid-registered-response-dto.d.ts +1 -1
  126. package/dist/esm/models/bid-registered-response-dto.js +1 -1
  127. package/dist/esm/models/bid-related-bid-dto.d.ts +1 -1
  128. package/dist/esm/models/bid-related-bid-dto.js +1 -1
  129. package/dist/esm/models/bid-required-document-dto.d.ts +1 -1
  130. package/dist/esm/models/bid-required-document-dto.js +1 -1
  131. package/dist/esm/models/bid-result-participant-attachment-dto.d.ts +1 -1
  132. package/dist/esm/models/bid-result-participant-attachment-dto.js +1 -1
  133. package/dist/esm/models/bid-result-participant-dto.d.ts +1 -1
  134. package/dist/esm/models/bid-result-participant-dto.js +1 -1
  135. package/dist/esm/models/bid-results-response-dto.d.ts +1 -1
  136. package/dist/esm/models/bid-results-response-dto.js +1 -1
  137. package/dist/esm/models/bid-site-briefing-dto.d.ts +1 -1
  138. package/dist/esm/models/bid-site-briefing-dto.js +1 -1
  139. package/dist/esm/models/bid-statement-response-dto.d.ts +1 -1
  140. package/dist/esm/models/bid-statement-response-dto.js +1 -1
  141. package/dist/esm/models/bidding-style-public.d.ts +1 -1
  142. package/dist/esm/models/bidding-style-public.js +1 -1
  143. package/dist/esm/models/card-payment-request-response-dto.d.ts +1 -1
  144. package/dist/esm/models/card-payment-request-response-dto.js +1 -1
  145. package/dist/esm/models/complete-acceptance-request-dto.d.ts +1 -1
  146. package/dist/esm/models/complete-acceptance-request-dto.js +1 -1
  147. package/dist/esm/models/complete-acceptance200-response.d.ts +1 -1
  148. package/dist/esm/models/complete-acceptance200-response.js +1 -1
  149. package/dist/esm/models/contract-restriction-confirm-input-dto.d.ts +1 -1
  150. package/dist/esm/models/contract-restriction-confirm-input-dto.js +1 -1
  151. package/dist/esm/models/create-bid-request-dto.d.ts +1 -1
  152. package/dist/esm/models/create-bid-request-dto.js +1 -1
  153. package/dist/esm/models/create-card-payment-dto.d.ts +1 -1
  154. package/dist/esm/models/create-card-payment-dto.js +1 -1
  155. package/dist/esm/models/create-card-payment-request-dto.d.ts +1 -1
  156. package/dist/esm/models/create-card-payment-request-dto.js +1 -1
  157. package/dist/esm/models/create-card-payment200-response.d.ts +1 -1
  158. package/dist/esm/models/create-card-payment200-response.js +1 -1
  159. package/dist/esm/models/create-embed-launch201-response.d.ts +1 -1
  160. package/dist/esm/models/create-embed-launch201-response.js +1 -1
  161. package/dist/esm/models/create-external-contract-documents-request-dto.d.ts +1 -1
  162. package/dist/esm/models/create-external-contract-documents-request-dto.js +1 -1
  163. package/dist/esm/models/create-external-contract-documents-response-dto.d.ts +1 -1
  164. package/dist/esm/models/create-external-contract-documents-response-dto.js +1 -1
  165. package/dist/esm/models/delivery-date-type-public.d.ts +1 -1
  166. package/dist/esm/models/delivery-date-type-public.js +1 -1
  167. package/dist/esm/models/delivery-method-public.d.ts +1 -1
  168. package/dist/esm/models/delivery-method-public.js +1 -1
  169. package/dist/esm/models/embed-bid-prefill-dto.d.ts +1 -1
  170. package/dist/esm/models/embed-bid-prefill-dto.js +1 -1
  171. package/dist/esm/models/embed-bid-prefill-item-dto.d.ts +1 -1
  172. package/dist/esm/models/embed-bid-prefill-item-dto.js +1 -1
  173. package/dist/esm/models/embed-bid-prefill-manager-dto.d.ts +1 -1
  174. package/dist/esm/models/embed-bid-prefill-manager-dto.js +1 -1
  175. package/dist/esm/models/embed-launch-request-dto.d.ts +1 -1
  176. package/dist/esm/models/embed-launch-request-dto.js +1 -1
  177. package/dist/esm/models/embed-launch-response-dto.d.ts +1 -1
  178. package/dist/esm/models/embed-launch-response-dto.js +1 -1
  179. package/dist/esm/models/excellent-procurement-public.d.ts +1 -1
  180. package/dist/esm/models/excellent-procurement-public.js +1 -1
  181. package/dist/esm/models/external-contract-document-item-dto.d.ts +1 -1
  182. package/dist/esm/models/external-contract-document-item-dto.js +1 -1
  183. package/dist/esm/models/external-contract-documents-response-dto.d.ts +1 -1
  184. package/dist/esm/models/external-contract-documents-response-dto.js +1 -1
  185. package/dist/esm/models/external-contract-item-dto.d.ts +1 -1
  186. package/dist/esm/models/external-contract-item-dto.js +1 -1
  187. package/dist/esm/models/external-contract-snapshot-dto.d.ts +1 -1
  188. package/dist/esm/models/external-contract-snapshot-dto.js +1 -1
  189. package/dist/esm/models/external-document-inputs-dto.d.ts +1 -1
  190. package/dist/esm/models/external-document-inputs-dto.js +1 -1
  191. package/dist/esm/models/file-uploaded-response-dto.d.ts +1 -1
  192. package/dist/esm/models/file-uploaded-response-dto.js +1 -1
  193. package/dist/esm/models/generated-external-contract-document-dto.d.ts +1 -1
  194. package/dist/esm/models/generated-external-contract-document-dto.js +1 -1
  195. package/dist/esm/models/get-bid-statement200-response.d.ts +1 -1
  196. package/dist/esm/models/get-bid-statement200-response.js +1 -1
  197. package/dist/esm/models/get-supplier-card-payable-v2200-response.d.ts +1 -1
  198. package/dist/esm/models/get-supplier-card-payable-v2200-response.js +1 -1
  199. package/dist/esm/models/green-product-public.d.ts +1 -1
  200. package/dist/esm/models/green-product-public.js +1 -1
  201. package/dist/esm/models/handover-type-public.d.ts +1 -1
  202. package/dist/esm/models/handover-type-public.js +1 -1
  203. package/dist/esm/models/health-controller-check200-response.d.ts +1 -1
  204. package/dist/esm/models/health-controller-check200-response.js +1 -1
  205. package/dist/esm/models/health-response-dto.d.ts +1 -1
  206. package/dist/esm/models/health-response-dto.js +1 -1
  207. package/dist/esm/models/hierarchical-region-dto.d.ts +1 -1
  208. package/dist/esm/models/hierarchical-region-dto.js +1 -1
  209. package/dist/esm/models/introspect-request-dto.d.ts +1 -1
  210. package/dist/esm/models/introspect-request-dto.js +1 -1
  211. package/dist/esm/models/introspection-response-dto.d.ts +1 -1
  212. package/dist/esm/models/introspection-response-dto.js +1 -1
  213. package/dist/esm/models/invalid-param-dto.d.ts +1 -1
  214. package/dist/esm/models/invalid-param-dto.js +1 -1
  215. package/dist/esm/models/invoice-split-response-dto.d.ts +1 -1
  216. package/dist/esm/models/invoice-split-response-dto.js +1 -1
  217. package/dist/esm/models/legal-mandatory-public.d.ts +1 -1
  218. package/dist/esm/models/legal-mandatory-public.js +1 -1
  219. package/dist/esm/models/license-combination-mode.d.ts +1 -1
  220. package/dist/esm/models/license-combination-mode.js +1 -1
  221. package/dist/esm/models/list-bid-results200-response-meta.d.ts +1 -1
  222. package/dist/esm/models/list-bid-results200-response-meta.js +1 -1
  223. package/dist/esm/models/list-bid-results200-response.d.ts +1 -1
  224. package/dist/esm/models/list-bid-results200-response.js +1 -1
  225. package/dist/esm/models/list-products200-response.d.ts +1 -1
  226. package/dist/esm/models/list-products200-response.js +1 -1
  227. package/dist/esm/models/mark-bid-failed-request-dto.d.ts +1 -1
  228. package/dist/esm/models/mark-bid-failed-request-dto.js +1 -1
  229. package/dist/esm/models/mark-bid-failed201-response.d.ts +1 -1
  230. package/dist/esm/models/mark-bid-failed201-response.js +1 -1
  231. package/dist/esm/models/nominated-supplier-dto.d.ts +1 -1
  232. package/dist/esm/models/nominated-supplier-dto.js +1 -1
  233. package/dist/esm/models/oauth-error-response-dto.d.ts +1 -1
  234. package/dist/esm/models/oauth-error-response-dto.js +1 -1
  235. package/dist/esm/models/payment-method-public.d.ts +1 -1
  236. package/dist/esm/models/payment-method-public.js +1 -1
  237. package/dist/esm/models/preconditions-dto.d.ts +1 -1
  238. package/dist/esm/models/preconditions-dto.js +1 -1
  239. package/dist/esm/models/preliminary-price-region-public.d.ts +1 -1
  240. package/dist/esm/models/preliminary-price-region-public.js +1 -1
  241. package/dist/esm/models/price-score-type-public.d.ts +1 -1
  242. package/dist/esm/models/price-score-type-public.js +1 -1
  243. package/dist/esm/models/pricing-type-public.d.ts +1 -1
  244. package/dist/esm/models/pricing-type-public.js +1 -1
  245. package/dist/esm/models/problem-details-dto.d.ts +1 -1
  246. package/dist/esm/models/problem-details-dto.js +1 -1
  247. package/dist/esm/models/product-receipt-response-dto.d.ts +1 -1
  248. package/dist/esm/models/product-receipt-response-dto.js +1 -1
  249. package/dist/esm/models/product-response-dto.d.ts +1 -1
  250. package/dist/esm/models/product-response-dto.js +1 -1
  251. package/dist/esm/models/protected-resource-metadata-dto.d.ts +1 -1
  252. package/dist/esm/models/protected-resource-metadata-dto.js +1 -1
  253. package/dist/esm/models/qualification-review-input-dto.d.ts +1 -1
  254. package/dist/esm/models/qualification-review-input-dto.js +1 -1
  255. package/dist/esm/models/register-award-request-dto.d.ts +1 -1
  256. package/dist/esm/models/register-award-request-dto.js +1 -1
  257. package/dist/esm/models/register-award201-response.d.ts +1 -1
  258. package/dist/esm/models/register-award201-response.js +1 -1
  259. package/dist/esm/models/register-bid201-response.d.ts +1 -1
  260. package/dist/esm/models/register-bid201-response.js +1 -1
  261. package/dist/esm/models/register-semo-contract-request-dto.d.ts +1 -1
  262. package/dist/esm/models/register-semo-contract-request-dto.js +1 -1
  263. package/dist/esm/models/regulation-type-public.d.ts +1 -1
  264. package/dist/esm/models/regulation-type-public.js +1 -1
  265. package/dist/esm/models/related-bid-relation.d.ts +1 -1
  266. package/dist/esm/models/related-bid-relation.js +1 -1
  267. package/dist/esm/models/request-invoice-split-request-dto.d.ts +1 -1
  268. package/dist/esm/models/request-invoice-split-request-dto.js +1 -1
  269. package/dist/esm/models/request-invoice-split200-response.d.ts +1 -1
  270. package/dist/esm/models/request-invoice-split200-response.js +1 -1
  271. package/dist/esm/models/retiree-roster-input-dto.d.ts +1 -1
  272. package/dist/esm/models/retiree-roster-input-dto.js +1 -1
  273. package/dist/esm/models/retiree-roster-row-dto.d.ts +1 -1
  274. package/dist/esm/models/retiree-roster-row-dto.js +1 -1
  275. package/dist/esm/models/revoke-request-dto.d.ts +1 -1
  276. package/dist/esm/models/revoke-request-dto.js +1 -1
  277. package/dist/esm/models/rotate-secret-request-dto.d.ts +1 -1
  278. package/dist/esm/models/rotate-secret-request-dto.js +1 -1
  279. package/dist/esm/models/rotate-secret-response-dto.d.ts +1 -1
  280. package/dist/esm/models/rotate-secret-response-dto.js +1 -1
  281. package/dist/esm/models/semo-contract-registered-response-dto.d.ts +1 -1
  282. package/dist/esm/models/semo-contract-registered-response-dto.js +1 -1
  283. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.d.ts +1 -1
  284. package/dist/esm/models/semo-contract-taxinvoice-status-response-dto.js +1 -1
  285. package/dist/esm/models/site-briefing-input-dto.d.ts +1 -1
  286. package/dist/esm/models/site-briefing-input-dto.js +1 -1
  287. package/dist/esm/models/statement-document-dto.d.ts +1 -1
  288. package/dist/esm/models/statement-document-dto.js +1 -1
  289. package/dist/esm/models/statement-product-dto.d.ts +1 -1
  290. package/dist/esm/models/statement-product-dto.js +1 -1
  291. package/dist/esm/models/supplier-card-payable-response-dto.d.ts +1 -1
  292. package/dist/esm/models/supplier-card-payable-response-dto.js +1 -1
  293. package/dist/esm/models/taxation-type-public.d.ts +1 -1
  294. package/dist/esm/models/taxation-type-public.js +1 -1
  295. package/dist/esm/models/token-request-dto.d.ts +1 -1
  296. package/dist/esm/models/token-request-dto.js +1 -1
  297. package/dist/esm/models/token-response-dto.d.ts +1 -1
  298. package/dist/esm/models/token-response-dto.js +1 -1
  299. package/dist/esm/models/two-stage-phase-public.d.ts +1 -1
  300. package/dist/esm/models/two-stage-phase-public.js +1 -1
  301. package/dist/esm/models/upload-file-request-dto.d.ts +1 -1
  302. package/dist/esm/models/upload-file-request-dto.js +1 -1
  303. package/dist/esm/models/upload-file201-response.d.ts +1 -1
  304. package/dist/esm/models/upload-file201-response.js +1 -1
  305. package/dist/esm/models/userinfo-response-dto.d.ts +1 -1
  306. package/dist/esm/models/userinfo-response-dto.js +1 -1
  307. package/dist/index.d.ts +1 -1
  308. package/dist/index.js +1 -1
  309. package/dist/models/acceptance-result-response-dto.d.ts +1 -1
  310. package/dist/models/acceptance-result-response-dto.js +1 -1
  311. package/dist/models/acknowledge-product-receipt200-response.d.ts +1 -1
  312. package/dist/models/acknowledge-product-receipt200-response.js +1 -1
  313. package/dist/models/acknowledge-products-request-dto.d.ts +1 -1
  314. package/dist/models/acknowledge-products-request-dto.js +1 -1
  315. package/dist/models/api-catalog-dto.d.ts +1 -1
  316. package/dist/models/api-catalog-dto.js +1 -1
  317. package/dist/models/api-catalog-entry-dto.d.ts +1 -1
  318. package/dist/models/api-catalog-entry-dto.js +1 -1
  319. package/dist/models/api-catalog-link-dto.d.ts +1 -1
  320. package/dist/models/api-catalog-link-dto.js +1 -1
  321. package/dist/models/authorization-server-metadata-dto.d.ts +1 -1
  322. package/dist/models/authorization-server-metadata-dto.js +1 -1
  323. package/dist/models/avalues-input-dto.d.ts +1 -1
  324. package/dist/models/avalues-input-dto.js +1 -1
  325. package/dist/models/award-method-public.d.ts +1 -1
  326. package/dist/models/award-method-public.js +1 -1
  327. package/dist/models/award-registered-v2-response-dto.d.ts +1 -1
  328. package/dist/models/award-registered-v2-response-dto.js +1 -1
  329. package/dist/models/bid-acceptance-dto.d.ts +1 -1
  330. package/dist/models/bid-acceptance-dto.js +1 -1
  331. package/dist/models/bid-attachment-dto.d.ts +1 -1
  332. package/dist/models/bid-attachment-dto.js +1 -1
  333. package/dist/models/bid-attachment-input-dto.d.ts +1 -1
  334. package/dist/models/bid-attachment-input-dto.js +1 -1
  335. package/dist/models/bid-avalues-dto.d.ts +1 -1
  336. package/dist/models/bid-avalues-dto.js +1 -1
  337. package/dist/models/bid-award-method-detail-dto.d.ts +1 -1
  338. package/dist/models/bid-award-method-detail-dto.js +1 -1
  339. package/dist/models/bid-bond-dto.d.ts +1 -1
  340. package/dist/models/bid-bond-dto.js +1 -1
  341. package/dist/models/bid-cancellation-dto.d.ts +1 -1
  342. package/dist/models/bid-cancellation-dto.js +1 -1
  343. package/dist/models/bid-category-public.d.ts +1 -1
  344. package/dist/models/bid-category-public.js +1 -1
  345. package/dist/models/bid-contact-dto.d.ts +1 -1
  346. package/dist/models/bid-contact-dto.js +1 -1
  347. package/dist/models/bid-contacts-dto.d.ts +1 -1
  348. package/dist/models/bid-contacts-dto.js +1 -1
  349. package/dist/models/bid-contract-document-dto.d.ts +1 -1
  350. package/dist/models/bid-contract-document-dto.js +1 -1
  351. package/dist/models/bid-delivery-terms-dto.d.ts +1 -1
  352. package/dist/models/bid-delivery-terms-dto.js +1 -1
  353. package/dist/models/bid-detail-response-dto.d.ts +1 -1
  354. package/dist/models/bid-detail-response-dto.js +1 -1
  355. package/dist/models/bid-document-dto.d.ts +1 -1
  356. package/dist/models/bid-document-dto.js +1 -1
  357. package/dist/models/bid-failed-v2-response-dto.d.ts +1 -1
  358. package/dist/models/bid-failed-v2-response-dto.js +1 -1
  359. package/dist/models/bid-item-dto.d.ts +1 -1
  360. package/dist/models/bid-item-dto.js +1 -1
  361. package/dist/models/bid-license-requirement-dto.d.ts +1 -1
  362. package/dist/models/bid-license-requirement-dto.js +1 -1
  363. package/dist/models/bid-lifecycle-dto.d.ts +1 -1
  364. package/dist/models/bid-lifecycle-dto.js +1 -1
  365. package/dist/models/bid-manager-dto.d.ts +1 -1
  366. package/dist/models/bid-manager-dto.js +1 -1
  367. package/dist/models/bid-must-read-notice-dto.d.ts +1 -1
  368. package/dist/models/bid-must-read-notice-dto.js +1 -1
  369. package/dist/models/bid-payment-terms-dto.d.ts +1 -1
  370. package/dist/models/bid-payment-terms-dto.js +1 -1
  371. package/dist/models/bid-preliminary-price-dto.d.ts +1 -1
  372. package/dist/models/bid-preliminary-price-dto.js +1 -1
  373. package/dist/models/bid-preliminary-price-slot-dto.d.ts +1 -1
  374. package/dist/models/bid-preliminary-price-slot-dto.js +1 -1
  375. package/dist/models/bid-product-dto.d.ts +1 -1
  376. package/dist/models/bid-product-dto.js +1 -1
  377. package/dist/models/bid-public-status.d.ts +1 -1
  378. package/dist/models/bid-public-status.js +1 -1
  379. package/dist/models/bid-qualification-review-dto.d.ts +1 -1
  380. package/dist/models/bid-qualification-review-dto.js +1 -1
  381. package/dist/models/bid-region-dto.d.ts +1 -1
  382. package/dist/models/bid-region-dto.js +1 -1
  383. package/dist/models/bid-region-restriction-dto.d.ts +1 -1
  384. package/dist/models/bid-region-restriction-dto.js +1 -1
  385. package/dist/models/bid-registered-response-dto.d.ts +1 -1
  386. package/dist/models/bid-registered-response-dto.js +1 -1
  387. package/dist/models/bid-related-bid-dto.d.ts +1 -1
  388. package/dist/models/bid-related-bid-dto.js +1 -1
  389. package/dist/models/bid-required-document-dto.d.ts +1 -1
  390. package/dist/models/bid-required-document-dto.js +1 -1
  391. package/dist/models/bid-result-participant-attachment-dto.d.ts +1 -1
  392. package/dist/models/bid-result-participant-attachment-dto.js +1 -1
  393. package/dist/models/bid-result-participant-dto.d.ts +1 -1
  394. package/dist/models/bid-result-participant-dto.js +1 -1
  395. package/dist/models/bid-results-response-dto.d.ts +1 -1
  396. package/dist/models/bid-results-response-dto.js +1 -1
  397. package/dist/models/bid-site-briefing-dto.d.ts +1 -1
  398. package/dist/models/bid-site-briefing-dto.js +1 -1
  399. package/dist/models/bid-statement-response-dto.d.ts +1 -1
  400. package/dist/models/bid-statement-response-dto.js +1 -1
  401. package/dist/models/bidding-style-public.d.ts +1 -1
  402. package/dist/models/bidding-style-public.js +1 -1
  403. package/dist/models/card-payment-request-response-dto.d.ts +1 -1
  404. package/dist/models/card-payment-request-response-dto.js +1 -1
  405. package/dist/models/complete-acceptance-request-dto.d.ts +1 -1
  406. package/dist/models/complete-acceptance-request-dto.js +1 -1
  407. package/dist/models/complete-acceptance200-response.d.ts +1 -1
  408. package/dist/models/complete-acceptance200-response.js +1 -1
  409. package/dist/models/contract-restriction-confirm-input-dto.d.ts +1 -1
  410. package/dist/models/contract-restriction-confirm-input-dto.js +1 -1
  411. package/dist/models/create-bid-request-dto.d.ts +1 -1
  412. package/dist/models/create-bid-request-dto.js +1 -1
  413. package/dist/models/create-card-payment-dto.d.ts +1 -1
  414. package/dist/models/create-card-payment-dto.js +1 -1
  415. package/dist/models/create-card-payment-request-dto.d.ts +1 -1
  416. package/dist/models/create-card-payment-request-dto.js +1 -1
  417. package/dist/models/create-card-payment200-response.d.ts +1 -1
  418. package/dist/models/create-card-payment200-response.js +1 -1
  419. package/dist/models/create-embed-launch201-response.d.ts +1 -1
  420. package/dist/models/create-embed-launch201-response.js +1 -1
  421. package/dist/models/create-external-contract-documents-request-dto.d.ts +1 -1
  422. package/dist/models/create-external-contract-documents-request-dto.js +1 -1
  423. package/dist/models/create-external-contract-documents-response-dto.d.ts +1 -1
  424. package/dist/models/create-external-contract-documents-response-dto.js +1 -1
  425. package/dist/models/delivery-date-type-public.d.ts +1 -1
  426. package/dist/models/delivery-date-type-public.js +1 -1
  427. package/dist/models/delivery-method-public.d.ts +1 -1
  428. package/dist/models/delivery-method-public.js +1 -1
  429. package/dist/models/embed-bid-prefill-dto.d.ts +1 -1
  430. package/dist/models/embed-bid-prefill-dto.js +1 -1
  431. package/dist/models/embed-bid-prefill-item-dto.d.ts +1 -1
  432. package/dist/models/embed-bid-prefill-item-dto.js +1 -1
  433. package/dist/models/embed-bid-prefill-manager-dto.d.ts +1 -1
  434. package/dist/models/embed-bid-prefill-manager-dto.js +1 -1
  435. package/dist/models/embed-launch-request-dto.d.ts +1 -1
  436. package/dist/models/embed-launch-request-dto.js +1 -1
  437. package/dist/models/embed-launch-response-dto.d.ts +1 -1
  438. package/dist/models/embed-launch-response-dto.js +1 -1
  439. package/dist/models/excellent-procurement-public.d.ts +1 -1
  440. package/dist/models/excellent-procurement-public.js +1 -1
  441. package/dist/models/external-contract-document-item-dto.d.ts +1 -1
  442. package/dist/models/external-contract-document-item-dto.js +1 -1
  443. package/dist/models/external-contract-documents-response-dto.d.ts +1 -1
  444. package/dist/models/external-contract-documents-response-dto.js +1 -1
  445. package/dist/models/external-contract-item-dto.d.ts +1 -1
  446. package/dist/models/external-contract-item-dto.js +1 -1
  447. package/dist/models/external-contract-snapshot-dto.d.ts +1 -1
  448. package/dist/models/external-contract-snapshot-dto.js +1 -1
  449. package/dist/models/external-document-inputs-dto.d.ts +1 -1
  450. package/dist/models/external-document-inputs-dto.js +1 -1
  451. package/dist/models/file-uploaded-response-dto.d.ts +1 -1
  452. package/dist/models/file-uploaded-response-dto.js +1 -1
  453. package/dist/models/generated-external-contract-document-dto.d.ts +1 -1
  454. package/dist/models/generated-external-contract-document-dto.js +1 -1
  455. package/dist/models/get-bid-statement200-response.d.ts +1 -1
  456. package/dist/models/get-bid-statement200-response.js +1 -1
  457. package/dist/models/get-supplier-card-payable-v2200-response.d.ts +1 -1
  458. package/dist/models/get-supplier-card-payable-v2200-response.js +1 -1
  459. package/dist/models/green-product-public.d.ts +1 -1
  460. package/dist/models/green-product-public.js +1 -1
  461. package/dist/models/handover-type-public.d.ts +1 -1
  462. package/dist/models/handover-type-public.js +1 -1
  463. package/dist/models/health-controller-check200-response.d.ts +1 -1
  464. package/dist/models/health-controller-check200-response.js +1 -1
  465. package/dist/models/health-response-dto.d.ts +1 -1
  466. package/dist/models/health-response-dto.js +1 -1
  467. package/dist/models/hierarchical-region-dto.d.ts +1 -1
  468. package/dist/models/hierarchical-region-dto.js +1 -1
  469. package/dist/models/introspect-request-dto.d.ts +1 -1
  470. package/dist/models/introspect-request-dto.js +1 -1
  471. package/dist/models/introspection-response-dto.d.ts +1 -1
  472. package/dist/models/introspection-response-dto.js +1 -1
  473. package/dist/models/invalid-param-dto.d.ts +1 -1
  474. package/dist/models/invalid-param-dto.js +1 -1
  475. package/dist/models/invoice-split-response-dto.d.ts +1 -1
  476. package/dist/models/invoice-split-response-dto.js +1 -1
  477. package/dist/models/legal-mandatory-public.d.ts +1 -1
  478. package/dist/models/legal-mandatory-public.js +1 -1
  479. package/dist/models/license-combination-mode.d.ts +1 -1
  480. package/dist/models/license-combination-mode.js +1 -1
  481. package/dist/models/list-bid-results200-response-meta.d.ts +1 -1
  482. package/dist/models/list-bid-results200-response-meta.js +1 -1
  483. package/dist/models/list-bid-results200-response.d.ts +1 -1
  484. package/dist/models/list-bid-results200-response.js +1 -1
  485. package/dist/models/list-products200-response.d.ts +1 -1
  486. package/dist/models/list-products200-response.js +1 -1
  487. package/dist/models/mark-bid-failed-request-dto.d.ts +1 -1
  488. package/dist/models/mark-bid-failed-request-dto.js +1 -1
  489. package/dist/models/mark-bid-failed201-response.d.ts +1 -1
  490. package/dist/models/mark-bid-failed201-response.js +1 -1
  491. package/dist/models/nominated-supplier-dto.d.ts +1 -1
  492. package/dist/models/nominated-supplier-dto.js +1 -1
  493. package/dist/models/oauth-error-response-dto.d.ts +1 -1
  494. package/dist/models/oauth-error-response-dto.js +1 -1
  495. package/dist/models/payment-method-public.d.ts +1 -1
  496. package/dist/models/payment-method-public.js +1 -1
  497. package/dist/models/preconditions-dto.d.ts +1 -1
  498. package/dist/models/preconditions-dto.js +1 -1
  499. package/dist/models/preliminary-price-region-public.d.ts +1 -1
  500. package/dist/models/preliminary-price-region-public.js +1 -1
  501. package/dist/models/price-score-type-public.d.ts +1 -1
  502. package/dist/models/price-score-type-public.js +1 -1
  503. package/dist/models/pricing-type-public.d.ts +1 -1
  504. package/dist/models/pricing-type-public.js +1 -1
  505. package/dist/models/problem-details-dto.d.ts +1 -1
  506. package/dist/models/problem-details-dto.js +1 -1
  507. package/dist/models/product-receipt-response-dto.d.ts +1 -1
  508. package/dist/models/product-receipt-response-dto.js +1 -1
  509. package/dist/models/product-response-dto.d.ts +1 -1
  510. package/dist/models/product-response-dto.js +1 -1
  511. package/dist/models/protected-resource-metadata-dto.d.ts +1 -1
  512. package/dist/models/protected-resource-metadata-dto.js +1 -1
  513. package/dist/models/qualification-review-input-dto.d.ts +1 -1
  514. package/dist/models/qualification-review-input-dto.js +1 -1
  515. package/dist/models/register-award-request-dto.d.ts +1 -1
  516. package/dist/models/register-award-request-dto.js +1 -1
  517. package/dist/models/register-award201-response.d.ts +1 -1
  518. package/dist/models/register-award201-response.js +1 -1
  519. package/dist/models/register-bid201-response.d.ts +1 -1
  520. package/dist/models/register-bid201-response.js +1 -1
  521. package/dist/models/register-semo-contract-request-dto.d.ts +1 -1
  522. package/dist/models/register-semo-contract-request-dto.js +1 -1
  523. package/dist/models/regulation-type-public.d.ts +1 -1
  524. package/dist/models/regulation-type-public.js +1 -1
  525. package/dist/models/related-bid-relation.d.ts +1 -1
  526. package/dist/models/related-bid-relation.js +1 -1
  527. package/dist/models/request-invoice-split-request-dto.d.ts +1 -1
  528. package/dist/models/request-invoice-split-request-dto.js +1 -1
  529. package/dist/models/request-invoice-split200-response.d.ts +1 -1
  530. package/dist/models/request-invoice-split200-response.js +1 -1
  531. package/dist/models/retiree-roster-input-dto.d.ts +1 -1
  532. package/dist/models/retiree-roster-input-dto.js +1 -1
  533. package/dist/models/retiree-roster-row-dto.d.ts +1 -1
  534. package/dist/models/retiree-roster-row-dto.js +1 -1
  535. package/dist/models/revoke-request-dto.d.ts +1 -1
  536. package/dist/models/revoke-request-dto.js +1 -1
  537. package/dist/models/rotate-secret-request-dto.d.ts +1 -1
  538. package/dist/models/rotate-secret-request-dto.js +1 -1
  539. package/dist/models/rotate-secret-response-dto.d.ts +1 -1
  540. package/dist/models/rotate-secret-response-dto.js +1 -1
  541. package/dist/models/semo-contract-registered-response-dto.d.ts +1 -1
  542. package/dist/models/semo-contract-registered-response-dto.js +1 -1
  543. package/dist/models/semo-contract-taxinvoice-status-response-dto.d.ts +1 -1
  544. package/dist/models/semo-contract-taxinvoice-status-response-dto.js +1 -1
  545. package/dist/models/site-briefing-input-dto.d.ts +1 -1
  546. package/dist/models/site-briefing-input-dto.js +1 -1
  547. package/dist/models/statement-document-dto.d.ts +1 -1
  548. package/dist/models/statement-document-dto.js +1 -1
  549. package/dist/models/statement-product-dto.d.ts +1 -1
  550. package/dist/models/statement-product-dto.js +1 -1
  551. package/dist/models/supplier-card-payable-response-dto.d.ts +1 -1
  552. package/dist/models/supplier-card-payable-response-dto.js +1 -1
  553. package/dist/models/taxation-type-public.d.ts +1 -1
  554. package/dist/models/taxation-type-public.js +1 -1
  555. package/dist/models/token-request-dto.d.ts +1 -1
  556. package/dist/models/token-request-dto.js +1 -1
  557. package/dist/models/token-response-dto.d.ts +1 -1
  558. package/dist/models/token-response-dto.js +1 -1
  559. package/dist/models/two-stage-phase-public.d.ts +1 -1
  560. package/dist/models/two-stage-phase-public.js +1 -1
  561. package/dist/models/upload-file-request-dto.d.ts +1 -1
  562. package/dist/models/upload-file-request-dto.js +1 -1
  563. package/dist/models/upload-file201-response.d.ts +1 -1
  564. package/dist/models/upload-file201-response.js +1 -1
  565. package/dist/models/userinfo-response-dto.d.ts +1 -1
  566. package/dist/models/userinfo-response-dto.js +1 -1
  567. package/docs/OauthApi.md +1 -1
  568. package/index.ts +1 -1
  569. package/models/acceptance-result-response-dto.ts +1 -1
  570. package/models/acknowledge-product-receipt200-response.ts +1 -1
  571. package/models/acknowledge-products-request-dto.ts +1 -1
  572. package/models/api-catalog-dto.ts +1 -1
  573. package/models/api-catalog-entry-dto.ts +1 -1
  574. package/models/api-catalog-link-dto.ts +1 -1
  575. package/models/authorization-server-metadata-dto.ts +1 -1
  576. package/models/avalues-input-dto.ts +1 -1
  577. package/models/award-method-public.ts +1 -1
  578. package/models/award-registered-v2-response-dto.ts +1 -1
  579. package/models/bid-acceptance-dto.ts +1 -1
  580. package/models/bid-attachment-dto.ts +1 -1
  581. package/models/bid-attachment-input-dto.ts +1 -1
  582. package/models/bid-avalues-dto.ts +1 -1
  583. package/models/bid-award-method-detail-dto.ts +1 -1
  584. package/models/bid-bond-dto.ts +1 -1
  585. package/models/bid-cancellation-dto.ts +1 -1
  586. package/models/bid-category-public.ts +1 -1
  587. package/models/bid-contact-dto.ts +1 -1
  588. package/models/bid-contacts-dto.ts +1 -1
  589. package/models/bid-contract-document-dto.ts +1 -1
  590. package/models/bid-delivery-terms-dto.ts +1 -1
  591. package/models/bid-detail-response-dto.ts +1 -1
  592. package/models/bid-document-dto.ts +1 -1
  593. package/models/bid-failed-v2-response-dto.ts +1 -1
  594. package/models/bid-item-dto.ts +1 -1
  595. package/models/bid-license-requirement-dto.ts +1 -1
  596. package/models/bid-lifecycle-dto.ts +1 -1
  597. package/models/bid-manager-dto.ts +1 -1
  598. package/models/bid-must-read-notice-dto.ts +1 -1
  599. package/models/bid-payment-terms-dto.ts +1 -1
  600. package/models/bid-preliminary-price-dto.ts +1 -1
  601. package/models/bid-preliminary-price-slot-dto.ts +1 -1
  602. package/models/bid-product-dto.ts +1 -1
  603. package/models/bid-public-status.ts +1 -1
  604. package/models/bid-qualification-review-dto.ts +1 -1
  605. package/models/bid-region-dto.ts +1 -1
  606. package/models/bid-region-restriction-dto.ts +1 -1
  607. package/models/bid-registered-response-dto.ts +1 -1
  608. package/models/bid-related-bid-dto.ts +1 -1
  609. package/models/bid-required-document-dto.ts +1 -1
  610. package/models/bid-result-participant-attachment-dto.ts +1 -1
  611. package/models/bid-result-participant-dto.ts +1 -1
  612. package/models/bid-results-response-dto.ts +1 -1
  613. package/models/bid-site-briefing-dto.ts +1 -1
  614. package/models/bid-statement-response-dto.ts +1 -1
  615. package/models/bidding-style-public.ts +1 -1
  616. package/models/card-payment-request-response-dto.ts +1 -1
  617. package/models/complete-acceptance-request-dto.ts +1 -1
  618. package/models/complete-acceptance200-response.ts +1 -1
  619. package/models/contract-restriction-confirm-input-dto.ts +1 -1
  620. package/models/create-bid-request-dto.ts +1 -1
  621. package/models/create-card-payment-dto.ts +1 -1
  622. package/models/create-card-payment-request-dto.ts +1 -1
  623. package/models/create-card-payment200-response.ts +1 -1
  624. package/models/create-embed-launch201-response.ts +1 -1
  625. package/models/create-external-contract-documents-request-dto.ts +1 -1
  626. package/models/create-external-contract-documents-response-dto.ts +1 -1
  627. package/models/delivery-date-type-public.ts +1 -1
  628. package/models/delivery-method-public.ts +1 -1
  629. package/models/embed-bid-prefill-dto.ts +1 -1
  630. package/models/embed-bid-prefill-item-dto.ts +1 -1
  631. package/models/embed-bid-prefill-manager-dto.ts +1 -1
  632. package/models/embed-launch-request-dto.ts +1 -1
  633. package/models/embed-launch-response-dto.ts +1 -1
  634. package/models/excellent-procurement-public.ts +1 -1
  635. package/models/external-contract-document-item-dto.ts +1 -1
  636. package/models/external-contract-documents-response-dto.ts +1 -1
  637. package/models/external-contract-item-dto.ts +1 -1
  638. package/models/external-contract-snapshot-dto.ts +1 -1
  639. package/models/external-document-inputs-dto.ts +1 -1
  640. package/models/file-uploaded-response-dto.ts +1 -1
  641. package/models/generated-external-contract-document-dto.ts +1 -1
  642. package/models/get-bid-statement200-response.ts +1 -1
  643. package/models/get-supplier-card-payable-v2200-response.ts +1 -1
  644. package/models/green-product-public.ts +1 -1
  645. package/models/handover-type-public.ts +1 -1
  646. package/models/health-controller-check200-response.ts +1 -1
  647. package/models/health-response-dto.ts +1 -1
  648. package/models/hierarchical-region-dto.ts +1 -1
  649. package/models/introspect-request-dto.ts +1 -1
  650. package/models/introspection-response-dto.ts +1 -1
  651. package/models/invalid-param-dto.ts +1 -1
  652. package/models/invoice-split-response-dto.ts +1 -1
  653. package/models/legal-mandatory-public.ts +1 -1
  654. package/models/license-combination-mode.ts +1 -1
  655. package/models/list-bid-results200-response-meta.ts +1 -1
  656. package/models/list-bid-results200-response.ts +1 -1
  657. package/models/list-products200-response.ts +1 -1
  658. package/models/mark-bid-failed-request-dto.ts +1 -1
  659. package/models/mark-bid-failed201-response.ts +1 -1
  660. package/models/nominated-supplier-dto.ts +1 -1
  661. package/models/oauth-error-response-dto.ts +1 -1
  662. package/models/payment-method-public.ts +1 -1
  663. package/models/preconditions-dto.ts +1 -1
  664. package/models/preliminary-price-region-public.ts +1 -1
  665. package/models/price-score-type-public.ts +1 -1
  666. package/models/pricing-type-public.ts +1 -1
  667. package/models/problem-details-dto.ts +1 -1
  668. package/models/product-receipt-response-dto.ts +1 -1
  669. package/models/product-response-dto.ts +1 -1
  670. package/models/protected-resource-metadata-dto.ts +1 -1
  671. package/models/qualification-review-input-dto.ts +1 -1
  672. package/models/register-award-request-dto.ts +1 -1
  673. package/models/register-award201-response.ts +1 -1
  674. package/models/register-bid201-response.ts +1 -1
  675. package/models/register-semo-contract-request-dto.ts +1 -1
  676. package/models/regulation-type-public.ts +1 -1
  677. package/models/related-bid-relation.ts +1 -1
  678. package/models/request-invoice-split-request-dto.ts +1 -1
  679. package/models/request-invoice-split200-response.ts +1 -1
  680. package/models/retiree-roster-input-dto.ts +1 -1
  681. package/models/retiree-roster-row-dto.ts +1 -1
  682. package/models/revoke-request-dto.ts +1 -1
  683. package/models/rotate-secret-request-dto.ts +1 -1
  684. package/models/rotate-secret-response-dto.ts +1 -1
  685. package/models/semo-contract-registered-response-dto.ts +1 -1
  686. package/models/semo-contract-taxinvoice-status-response-dto.ts +1 -1
  687. package/models/site-briefing-input-dto.ts +1 -1
  688. package/models/statement-document-dto.ts +1 -1
  689. package/models/statement-product-dto.ts +1 -1
  690. package/models/supplier-card-payable-response-dto.ts +1 -1
  691. package/models/taxation-type-public.ts +1 -1
  692. package/models/token-request-dto.ts +1 -1
  693. package/models/token-response-dto.ts +1 -1
  694. package/models/two-stage-phase-public.ts +1 -1
  695. package/models/upload-file-request-dto.ts +1 -1
  696. package/models/upload-file201-response.ts +1 -1
  697. package/models/userinfo-response-dto.ts +1 -1
  698. package/package.json +1 -1
@@ -5,7 +5,7 @@
5
5
  * CMARKET V6 Partner API
6
6
  * μ™ΈλΆ€ ERP μ—°λ™μš© RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` ν”Œλ‘œμš°). `/oauth/token`μ—μ„œ 토큰을 λ°œκΈ‰λ°›μ•„ `Authorization: Bearer <token>` ν—€λ”λ‘œ μ‹€μœΌμ„Έμš”. ## κΆŒν•œ β€” 두 개의 λ…λ¦½λœ μΆ• `403`을 λ§Œλ‚¬λ‹€λ©΄ λ‘˜ 쀑 μ–΄λŠ 좕에 κ±Έλ¦° 것인지 λ¨Όμ € κ΅¬λΆ„ν•˜μ„Έμš”. - **μŠ€μ½”ν”„** = *무엇을 ν•  수 μžˆλ‚˜*. 토큰에 λΆ€μ—¬λœ `bids:read`Β·`contracts:write` λ“±μž…λ‹ˆλ‹€. 미보유 μ‹œ `…/insufficient-scope`. - **λŒ€ν–‰ λ²”μœ„** = *λˆ„κ΅¬μ˜ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‚˜*. API ν‚€ 섀정이며 μŠ€μ½”ν”„λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ²”μœ„ 밖이면 μŠ€μ½”ν”„μ™€ λ¬΄κ΄€ν•˜κ²Œ 403μž…λ‹ˆλ‹€. λŒ€ν–‰ λ²”μœ„λŠ” ν‚€λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ‘œ μ„€μ •λ©λ‹ˆλ‹€ β€” **μ†Œμ† κ·Έλ£Ή 전원**(κΈ°κ΄€ ν‚€. μ‚¬μ—…μ²˜Β·λΆ€μ„œ 계정이 μƒˆλ‘œ 생겨도 μžλ™ 포함) λ˜λŠ” **μ§€μ • λ°œμ£ΌκΈ°κ΄€ λͺ©λ‘**(κ³„μ•½μœΌλ‘œ ν•©μ˜λœ λͺ©λ‘). λ²”μœ„λ₯Ό λ„“ν˜€μ•Ό ν•˜λ©΄ μŠ€μ½”ν”„κ°€ μ•„λ‹ˆλΌ ν‚€ μ„€μ • 변경을 μš”μ²­ν•˜μ„Έμš”. ## 성곡 응닡 ν˜•μ‹ `/v2`의 λͺ¨λ“  2xx 본문은 `{ \"data\": … }`μž…λ‹ˆλ‹€. 단일 λ¦¬μ†ŒμŠ€λ“  λͺ©λ‘μ΄λ“  κ°™μŠ΅λ‹ˆλ‹€. **λͺ©λ‘μ€ `data`κ°€ 배열이고 `meta`κ°€ 항상 ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€** β€” `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 λ¦¬μ†ŒμŠ€ μ‘λ‹΅μ—λŠ” `meta`κ°€ λ‚˜κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 ν˜•μ‹μ„ μ“°μ§€ μ•ŠλŠ” μ—”λ“œν¬μΈνŠΈλŠ” λ‘˜μž…λ‹ˆλ‹€. `/oauth/_*`와 `/.well-known/_*`λŠ” 각각 RFC 6749Β·RFC 8414Β·RFC 9728이 μ΅œμƒμœ„ ν•„λ“œλ₯Ό κ·œμ •ν•˜κ³ , 파일 λ‚΄μš© 응닡은 본문이 JSON이 μ•„λ‹™λ‹ˆλ‹€. μ—λŸ¬ μ‘λ‹΅μ—λŠ” 이 ν˜•μ‹μ„ μ”Œμš°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” μ•„λž˜ problem+json이 λ‹¨λ…μœΌλ‘œ μ±…μž„μ§‘λ‹ˆλ‹€. ## 쑰건뢀 μš”μ²­ (ETag) `/v2`의 λͺ¨λ“  `GET` 응닡에 weak `ETag`(`W/\"…\"`)κ°€ μ‹€λ¦½λ‹ˆλ‹€. 받은 값을 λ‹€μŒ μš”μ²­μ˜ `If-None-Match` ν—€λ”λ‘œ λ˜λ³΄λ‚΄λ©΄, λ‚΄μš©μ΄ κ·ΈλŒ€λ‘œμΌ λ•Œ `304 Not Modified`λ₯Ό λ³Έλ¬Έ 없이 λ°›μŠ΅λ‹ˆλ‹€. κ²°κ³Όκ°€ λ‚˜κΈ°λ₯Ό 기닀리며 같은 μžμ›μ„ 반볡 μ‘°νšŒν•˜λŠ” 연동이라면 이 헀더 ν•˜λ‚˜λ‘œ μ „μ†‘λŸ‰μ΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. ## μ—λŸ¬ (RFC 9457 problem+json) λͺ¨λ“  μ—λŸ¬ 응닡은 `application/problem+json`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 409와 422의 차이 - `409` `…/idempotency-key-conflict` β€” 같은 ν‚€μ˜ **원 μš”μ²­μ΄ 아직 처리 쀑**μž…λ‹ˆλ‹€. μž μ‹œ λ’€ 같은 ν‚€λ‘œ λ‹€μ‹œ λΆ€λ₯΄λ©΄ κ·Έ κ²°κ³Όλ₯Ό λ°›μŠ΅λ‹ˆλ‹€. - `422` `…/idempotency-key-reused` β€” 같은 ν‚€λ₯Ό **λ‹€λ₯Έ body** 둜 λ³΄λƒˆμŠ΅λ‹ˆλ‹€. μž¬μ‹œλ„ν•΄λ„ μ˜μ›νžˆ 같은 μ‹€νŒ¨μ΄λ‹ˆ μƒˆ ν‚€λ₯Ό μ“°κ±°λ‚˜ bodyλ₯Ό λ˜λŒλ¦¬μ„Έμš”. ## Rate Limit μ „μ—­ **60 μš”μ²­/λΆ„ per `client_id`**, 토큰 λ°œκΈ‰(`/oauth/token`)은 **5 μš”μ²­/λΆ„** μž…λ‹ˆλ‹€. 초과 μ‹œ `429`(`type: …/too-many-requests`). μΏΌν„°λŠ” 두 κ°€μ§€ ν‘œκΈ°λ‘œ ν•¨κ»˜ λ‚˜κ°‘λ‹ˆλ‹€ β€” μ‹ κ·œ 연동은 ν‘œμ€€ ν•„λ“œλ₯Ό μ“°μ„Έμš”. - **ν‘œμ€€**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (μ •μ±…) Β· `RateLimit: \"default\";r=59;t=42` (μž”λŸ‰ r, λ¦¬μ…‹κΉŒμ§€ t 초) - **λ ˆκ±°μ‹œ**(κ΄€μš©): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. κΈ°μ‘΄ 연동 ν˜Έν™˜μ„ μœ„ν•΄ μœ μ§€ν•©λ‹ˆλ‹€. `429` μ—μ„œλŠ” `Retry-After`(초)κ°€ μš°μ„ ν•©λ‹ˆλ‹€. λŒ€λŸ‰ 동기화(ν’ˆλͺ© λ‹¨μœ„ 반볡 등둝 λ“±)λŠ” `Retry-After` 만큼 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. ## 좔적 μš”μ²­μ— `X-Correlation-Id` 헀더λ₯Ό μ‹€μœΌλ©΄ κ·ΈλŒ€λ‘œ echo 되고, μ—†μœΌλ©΄ μ„œλ²„κ°€ λ°œκΈ‰ν•©λ‹ˆλ‹€. λͺ¨λ“  응닡(성곡/μ—λŸ¬)에 `X-Correlation-Id`κ°€ μ‹€λ¦½λ‹ˆλ‹€. ## μ „λ°©ν˜Έν™˜ β€” λͺ¨λ₯΄λŠ” ν•„λ“œμ™€ κ°’μ—μ„œ κΉ¨μ§€μ§€ μ•Šκ²Œ λ‹€μŒ 셋은 breaking λ³€κ²½μœΌλ‘œ 보지 μ•ŠμœΌλ©° minor λ¦΄λ¦¬μŠ€μ—μ„œ 예고 없이 μΌμ–΄λ‚©λ‹ˆλ‹€. 이 μ „μ œλ‘œ κ΅¬ν˜„ν•˜μ„Έμš”. - **선택 ν•„λ“œ μΆ”κ°€**: λͺ¨λ₯΄λŠ” ν•„λ“œλŠ” λ¬΄μ‹œν•˜μ„Έμš”. 엄격 νŒŒμ„œ(unknown key κ±°λΆ€)λ₯Ό μ“°μ§€ λ§ˆμ„Έμš”. - **enum κ°’ μΆ”κ°€**: μƒνƒœΒ·λ‚™μ°°λ°©λ²• 등에 μƒˆ 값이 μƒκΉλ‹ˆλ‹€. λͺ¨λ₯΄λŠ” 값을 λ§Œλ‚˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ 말고 원문 λ¬Έμžμ—΄μ„ λ³΄μ‘΄ν•˜μ„Έμš”. - **problem `type` slug μΆ”κ°€**: λͺ¨λ₯΄λŠ” slug은 **HTTP status둜 폴백**ν•΄ λΆ„κΈ°ν•˜μ„Έμš”. ## 버전 수λͺ…(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
7
7
  *
8
- * The version of the OpenAPI document: 50.2.0
8
+ * The version of the OpenAPI document: 50.3.0
9
9
  * Contact: semo.io.kr@gmail.com
10
10
  *
11
11
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/api.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/api.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * CMARKET V6 Partner API
6
6
  * μ™ΈλΆ€ ERP μ—°λ™μš© RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` ν”Œλ‘œμš°). `/oauth/token`μ—μ„œ 토큰을 λ°œκΈ‰λ°›μ•„ `Authorization: Bearer <token>` ν—€λ”λ‘œ μ‹€μœΌμ„Έμš”. ## κΆŒν•œ β€” 두 개의 λ…λ¦½λœ μΆ• `403`을 λ§Œλ‚¬λ‹€λ©΄ λ‘˜ 쀑 μ–΄λŠ 좕에 κ±Έλ¦° 것인지 λ¨Όμ € κ΅¬λΆ„ν•˜μ„Έμš”. - **μŠ€μ½”ν”„** = *무엇을 ν•  수 μžˆλ‚˜*. 토큰에 λΆ€μ—¬λœ `bids:read`Β·`contracts:write` λ“±μž…λ‹ˆλ‹€. 미보유 μ‹œ `…/insufficient-scope`. - **λŒ€ν–‰ λ²”μœ„** = *λˆ„κ΅¬μ˜ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‚˜*. API ν‚€ 섀정이며 μŠ€μ½”ν”„λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ²”μœ„ 밖이면 μŠ€μ½”ν”„μ™€ λ¬΄κ΄€ν•˜κ²Œ 403μž…λ‹ˆλ‹€. λŒ€ν–‰ λ²”μœ„λŠ” ν‚€λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ‘œ μ„€μ •λ©λ‹ˆλ‹€ β€” **μ†Œμ† κ·Έλ£Ή 전원**(κΈ°κ΄€ ν‚€. μ‚¬μ—…μ²˜Β·λΆ€μ„œ 계정이 μƒˆλ‘œ 생겨도 μžλ™ 포함) λ˜λŠ” **μ§€μ • λ°œμ£ΌκΈ°κ΄€ λͺ©λ‘**(κ³„μ•½μœΌλ‘œ ν•©μ˜λœ λͺ©λ‘). λ²”μœ„λ₯Ό λ„“ν˜€μ•Ό ν•˜λ©΄ μŠ€μ½”ν”„κ°€ μ•„λ‹ˆλΌ ν‚€ μ„€μ • 변경을 μš”μ²­ν•˜μ„Έμš”. ## 성곡 응닡 ν˜•μ‹ `/v2`의 λͺ¨λ“  2xx 본문은 `{ \"data\": … }`μž…λ‹ˆλ‹€. 단일 λ¦¬μ†ŒμŠ€λ“  λͺ©λ‘μ΄λ“  κ°™μŠ΅λ‹ˆλ‹€. **λͺ©λ‘μ€ `data`κ°€ 배열이고 `meta`κ°€ 항상 ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€** β€” `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 λ¦¬μ†ŒμŠ€ μ‘λ‹΅μ—λŠ” `meta`κ°€ λ‚˜κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 ν˜•μ‹μ„ μ“°μ§€ μ•ŠλŠ” μ—”λ“œν¬μΈνŠΈλŠ” λ‘˜μž…λ‹ˆλ‹€. `/oauth/_*`와 `/.well-known/_*`λŠ” 각각 RFC 6749Β·RFC 8414Β·RFC 9728이 μ΅œμƒμœ„ ν•„λ“œλ₯Ό κ·œμ •ν•˜κ³ , 파일 λ‚΄μš© 응닡은 본문이 JSON이 μ•„λ‹™λ‹ˆλ‹€. μ—λŸ¬ μ‘λ‹΅μ—λŠ” 이 ν˜•μ‹μ„ μ”Œμš°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” μ•„λž˜ problem+json이 λ‹¨λ…μœΌλ‘œ μ±…μž„μ§‘λ‹ˆλ‹€. ## 쑰건뢀 μš”μ²­ (ETag) `/v2`의 λͺ¨λ“  `GET` 응닡에 weak `ETag`(`W/\"…\"`)κ°€ μ‹€λ¦½λ‹ˆλ‹€. 받은 값을 λ‹€μŒ μš”μ²­μ˜ `If-None-Match` ν—€λ”λ‘œ λ˜λ³΄λ‚΄λ©΄, λ‚΄μš©μ΄ κ·ΈλŒ€λ‘œμΌ λ•Œ `304 Not Modified`λ₯Ό λ³Έλ¬Έ 없이 λ°›μŠ΅λ‹ˆλ‹€. κ²°κ³Όκ°€ λ‚˜κΈ°λ₯Ό 기닀리며 같은 μžμ›μ„ 반볡 μ‘°νšŒν•˜λŠ” 연동이라면 이 헀더 ν•˜λ‚˜λ‘œ μ „μ†‘λŸ‰μ΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. ## μ—λŸ¬ (RFC 9457 problem+json) λͺ¨λ“  μ—λŸ¬ 응닡은 `application/problem+json`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 409와 422의 차이 - `409` `…/idempotency-key-conflict` β€” 같은 ν‚€μ˜ **원 μš”μ²­μ΄ 아직 처리 쀑**μž…λ‹ˆλ‹€. μž μ‹œ λ’€ 같은 ν‚€λ‘œ λ‹€μ‹œ λΆ€λ₯΄λ©΄ κ·Έ κ²°κ³Όλ₯Ό λ°›μŠ΅λ‹ˆλ‹€. - `422` `…/idempotency-key-reused` β€” 같은 ν‚€λ₯Ό **λ‹€λ₯Έ body** 둜 λ³΄λƒˆμŠ΅λ‹ˆλ‹€. μž¬μ‹œλ„ν•΄λ„ μ˜μ›νžˆ 같은 μ‹€νŒ¨μ΄λ‹ˆ μƒˆ ν‚€λ₯Ό μ“°κ±°λ‚˜ bodyλ₯Ό λ˜λŒλ¦¬μ„Έμš”. ## Rate Limit μ „μ—­ **60 μš”μ²­/λΆ„ per `client_id`**, 토큰 λ°œκΈ‰(`/oauth/token`)은 **5 μš”μ²­/λΆ„** μž…λ‹ˆλ‹€. 초과 μ‹œ `429`(`type: …/too-many-requests`). μΏΌν„°λŠ” 두 κ°€μ§€ ν‘œκΈ°λ‘œ ν•¨κ»˜ λ‚˜κ°‘λ‹ˆλ‹€ β€” μ‹ κ·œ 연동은 ν‘œμ€€ ν•„λ“œλ₯Ό μ“°μ„Έμš”. - **ν‘œμ€€**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (μ •μ±…) Β· `RateLimit: \"default\";r=59;t=42` (μž”λŸ‰ r, λ¦¬μ…‹κΉŒμ§€ t 초) - **λ ˆκ±°μ‹œ**(κ΄€μš©): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. κΈ°μ‘΄ 연동 ν˜Έν™˜μ„ μœ„ν•΄ μœ μ§€ν•©λ‹ˆλ‹€. `429` μ—μ„œλŠ” `Retry-After`(초)κ°€ μš°μ„ ν•©λ‹ˆλ‹€. λŒ€λŸ‰ 동기화(ν’ˆλͺ© λ‹¨μœ„ 반볡 등둝 λ“±)λŠ” `Retry-After` 만큼 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. ## 좔적 μš”μ²­μ— `X-Correlation-Id` 헀더λ₯Ό μ‹€μœΌλ©΄ κ·ΈλŒ€λ‘œ echo 되고, μ—†μœΌλ©΄ μ„œλ²„κ°€ λ°œκΈ‰ν•©λ‹ˆλ‹€. λͺ¨λ“  응닡(성곡/μ—λŸ¬)에 `X-Correlation-Id`κ°€ μ‹€λ¦½λ‹ˆλ‹€. ## μ „λ°©ν˜Έν™˜ β€” λͺ¨λ₯΄λŠ” ν•„λ“œμ™€ κ°’μ—μ„œ κΉ¨μ§€μ§€ μ•Šκ²Œ λ‹€μŒ 셋은 breaking λ³€κ²½μœΌλ‘œ 보지 μ•ŠμœΌλ©° minor λ¦΄λ¦¬μŠ€μ—μ„œ 예고 없이 μΌμ–΄λ‚©λ‹ˆλ‹€. 이 μ „μ œλ‘œ κ΅¬ν˜„ν•˜μ„Έμš”. - **선택 ν•„λ“œ μΆ”κ°€**: λͺ¨λ₯΄λŠ” ν•„λ“œλŠ” λ¬΄μ‹œν•˜μ„Έμš”. 엄격 νŒŒμ„œ(unknown key κ±°λΆ€)λ₯Ό μ“°μ§€ λ§ˆμ„Έμš”. - **enum κ°’ μΆ”κ°€**: μƒνƒœΒ·λ‚™μ°°λ°©λ²• 등에 μƒˆ 값이 μƒκΉλ‹ˆλ‹€. λͺ¨λ₯΄λŠ” 값을 λ§Œλ‚˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ 말고 원문 λ¬Έμžμ—΄μ„ λ³΄μ‘΄ν•˜μ„Έμš”. - **problem `type` slug μΆ”κ°€**: λͺ¨λ₯΄λŠ” slug은 **HTTP status둜 폴백**ν•΄ λΆ„κΈ°ν•˜μ„Έμš”. ## 버전 수λͺ…(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
7
7
  *
8
- * The version of the OpenAPI document: 50.2.0
8
+ * The version of the OpenAPI document: 50.3.0
9
9
  * Contact: semo.io.kr@gmail.com
10
10
  *
11
11
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/base.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/base.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * CMARKET V6 Partner API
6
6
  * μ™ΈλΆ€ ERP μ—°λ™μš© RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` ν”Œλ‘œμš°). `/oauth/token`μ—μ„œ 토큰을 λ°œκΈ‰λ°›μ•„ `Authorization: Bearer <token>` ν—€λ”λ‘œ μ‹€μœΌμ„Έμš”. ## κΆŒν•œ β€” 두 개의 λ…λ¦½λœ μΆ• `403`을 λ§Œλ‚¬λ‹€λ©΄ λ‘˜ 쀑 μ–΄λŠ 좕에 κ±Έλ¦° 것인지 λ¨Όμ € κ΅¬λΆ„ν•˜μ„Έμš”. - **μŠ€μ½”ν”„** = *무엇을 ν•  수 μžˆλ‚˜*. 토큰에 λΆ€μ—¬λœ `bids:read`Β·`contracts:write` λ“±μž…λ‹ˆλ‹€. 미보유 μ‹œ `…/insufficient-scope`. - **λŒ€ν–‰ λ²”μœ„** = *λˆ„κ΅¬μ˜ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‚˜*. API ν‚€ 섀정이며 μŠ€μ½”ν”„λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ²”μœ„ 밖이면 μŠ€μ½”ν”„μ™€ λ¬΄κ΄€ν•˜κ²Œ 403μž…λ‹ˆλ‹€. λŒ€ν–‰ λ²”μœ„λŠ” ν‚€λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ‘œ μ„€μ •λ©λ‹ˆλ‹€ β€” **μ†Œμ† κ·Έλ£Ή 전원**(κΈ°κ΄€ ν‚€. μ‚¬μ—…μ²˜Β·λΆ€μ„œ 계정이 μƒˆλ‘œ 생겨도 μžλ™ 포함) λ˜λŠ” **μ§€μ • λ°œμ£ΌκΈ°κ΄€ λͺ©λ‘**(κ³„μ•½μœΌλ‘œ ν•©μ˜λœ λͺ©λ‘). λ²”μœ„λ₯Ό λ„“ν˜€μ•Ό ν•˜λ©΄ μŠ€μ½”ν”„κ°€ μ•„λ‹ˆλΌ ν‚€ μ„€μ • 변경을 μš”μ²­ν•˜μ„Έμš”. ## 성곡 응닡 ν˜•μ‹ `/v2`의 λͺ¨λ“  2xx 본문은 `{ \"data\": … }`μž…λ‹ˆλ‹€. 단일 λ¦¬μ†ŒμŠ€λ“  λͺ©λ‘μ΄λ“  κ°™μŠ΅λ‹ˆλ‹€. **λͺ©λ‘μ€ `data`κ°€ 배열이고 `meta`κ°€ 항상 ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€** β€” `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 λ¦¬μ†ŒμŠ€ μ‘λ‹΅μ—λŠ” `meta`κ°€ λ‚˜κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 ν˜•μ‹μ„ μ“°μ§€ μ•ŠλŠ” μ—”λ“œν¬μΈνŠΈλŠ” λ‘˜μž…λ‹ˆλ‹€. `/oauth/_*`와 `/.well-known/_*`λŠ” 각각 RFC 6749Β·RFC 8414Β·RFC 9728이 μ΅œμƒμœ„ ν•„λ“œλ₯Ό κ·œμ •ν•˜κ³ , 파일 λ‚΄μš© 응닡은 본문이 JSON이 μ•„λ‹™λ‹ˆλ‹€. μ—λŸ¬ μ‘λ‹΅μ—λŠ” 이 ν˜•μ‹μ„ μ”Œμš°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” μ•„λž˜ problem+json이 λ‹¨λ…μœΌλ‘œ μ±…μž„μ§‘λ‹ˆλ‹€. ## 쑰건뢀 μš”μ²­ (ETag) `/v2`의 λͺ¨λ“  `GET` 응닡에 weak `ETag`(`W/\"…\"`)κ°€ μ‹€λ¦½λ‹ˆλ‹€. 받은 값을 λ‹€μŒ μš”μ²­μ˜ `If-None-Match` ν—€λ”λ‘œ λ˜λ³΄λ‚΄λ©΄, λ‚΄μš©μ΄ κ·ΈλŒ€λ‘œμΌ λ•Œ `304 Not Modified`λ₯Ό λ³Έλ¬Έ 없이 λ°›μŠ΅λ‹ˆλ‹€. κ²°κ³Όκ°€ λ‚˜κΈ°λ₯Ό 기닀리며 같은 μžμ›μ„ 반볡 μ‘°νšŒν•˜λŠ” 연동이라면 이 헀더 ν•˜λ‚˜λ‘œ μ „μ†‘λŸ‰μ΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. ## μ—λŸ¬ (RFC 9457 problem+json) λͺ¨λ“  μ—λŸ¬ 응닡은 `application/problem+json`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 409와 422의 차이 - `409` `…/idempotency-key-conflict` β€” 같은 ν‚€μ˜ **원 μš”μ²­μ΄ 아직 처리 쀑**μž…λ‹ˆλ‹€. μž μ‹œ λ’€ 같은 ν‚€λ‘œ λ‹€μ‹œ λΆ€λ₯΄λ©΄ κ·Έ κ²°κ³Όλ₯Ό λ°›μŠ΅λ‹ˆλ‹€. - `422` `…/idempotency-key-reused` β€” 같은 ν‚€λ₯Ό **λ‹€λ₯Έ body** 둜 λ³΄λƒˆμŠ΅λ‹ˆλ‹€. μž¬μ‹œλ„ν•΄λ„ μ˜μ›νžˆ 같은 μ‹€νŒ¨μ΄λ‹ˆ μƒˆ ν‚€λ₯Ό μ“°κ±°λ‚˜ bodyλ₯Ό λ˜λŒλ¦¬μ„Έμš”. ## Rate Limit μ „μ—­ **60 μš”μ²­/λΆ„ per `client_id`**, 토큰 λ°œκΈ‰(`/oauth/token`)은 **5 μš”μ²­/λΆ„** μž…λ‹ˆλ‹€. 초과 μ‹œ `429`(`type: …/too-many-requests`). μΏΌν„°λŠ” 두 κ°€μ§€ ν‘œκΈ°λ‘œ ν•¨κ»˜ λ‚˜κ°‘λ‹ˆλ‹€ β€” μ‹ κ·œ 연동은 ν‘œμ€€ ν•„λ“œλ₯Ό μ“°μ„Έμš”. - **ν‘œμ€€**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (μ •μ±…) Β· `RateLimit: \"default\";r=59;t=42` (μž”λŸ‰ r, λ¦¬μ…‹κΉŒμ§€ t 초) - **λ ˆκ±°μ‹œ**(κ΄€μš©): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. κΈ°μ‘΄ 연동 ν˜Έν™˜μ„ μœ„ν•΄ μœ μ§€ν•©λ‹ˆλ‹€. `429` μ—μ„œλŠ” `Retry-After`(초)κ°€ μš°μ„ ν•©λ‹ˆλ‹€. λŒ€λŸ‰ 동기화(ν’ˆλͺ© λ‹¨μœ„ 반볡 등둝 λ“±)λŠ” `Retry-After` 만큼 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. ## 좔적 μš”μ²­μ— `X-Correlation-Id` 헀더λ₯Ό μ‹€μœΌλ©΄ κ·ΈλŒ€λ‘œ echo 되고, μ—†μœΌλ©΄ μ„œλ²„κ°€ λ°œκΈ‰ν•©λ‹ˆλ‹€. λͺ¨λ“  응닡(성곡/μ—λŸ¬)에 `X-Correlation-Id`κ°€ μ‹€λ¦½λ‹ˆλ‹€. ## μ „λ°©ν˜Έν™˜ β€” λͺ¨λ₯΄λŠ” ν•„λ“œμ™€ κ°’μ—μ„œ κΉ¨μ§€μ§€ μ•Šκ²Œ λ‹€μŒ 셋은 breaking λ³€κ²½μœΌλ‘œ 보지 μ•ŠμœΌλ©° minor λ¦΄λ¦¬μŠ€μ—μ„œ 예고 없이 μΌμ–΄λ‚©λ‹ˆλ‹€. 이 μ „μ œλ‘œ κ΅¬ν˜„ν•˜μ„Έμš”. - **선택 ν•„λ“œ μΆ”κ°€**: λͺ¨λ₯΄λŠ” ν•„λ“œλŠ” λ¬΄μ‹œν•˜μ„Έμš”. 엄격 νŒŒμ„œ(unknown key κ±°λΆ€)λ₯Ό μ“°μ§€ λ§ˆμ„Έμš”. - **enum κ°’ μΆ”κ°€**: μƒνƒœΒ·λ‚™μ°°λ°©λ²• 등에 μƒˆ 값이 μƒκΉλ‹ˆλ‹€. λͺ¨λ₯΄λŠ” 값을 λ§Œλ‚˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ 말고 원문 λ¬Έμžμ—΄μ„ λ³΄μ‘΄ν•˜μ„Έμš”. - **problem `type` slug μΆ”κ°€**: λͺ¨λ₯΄λŠ” slug은 **HTTP status둜 폴백**ν•΄ λΆ„κΈ°ν•˜μ„Έμš”. ## 버전 수λͺ…(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
7
7
  *
8
- * The version of the OpenAPI document: 50.2.0
8
+ * The version of the OpenAPI document: 50.3.0
9
9
  * Contact: semo.io.kr@gmail.com
10
10
  *
11
11
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/common.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
package/dist/common.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * CMARKET V6 Partner API
6
6
  * μ™ΈλΆ€ ERP μ—°λ™μš© RESTful API. ## 인증 OAuth2 Bearer JWT (`client_credentials` ν”Œλ‘œμš°). `/oauth/token`μ—μ„œ 토큰을 λ°œκΈ‰λ°›μ•„ `Authorization: Bearer <token>` ν—€λ”λ‘œ μ‹€μœΌμ„Έμš”. ## κΆŒν•œ β€” 두 개의 λ…λ¦½λœ μΆ• `403`을 λ§Œλ‚¬λ‹€λ©΄ λ‘˜ 쀑 μ–΄λŠ 좕에 κ±Έλ¦° 것인지 λ¨Όμ € κ΅¬λΆ„ν•˜μ„Έμš”. - **μŠ€μ½”ν”„** = *무엇을 ν•  수 μžˆλ‚˜*. 토큰에 λΆ€μ—¬λœ `bids:read`Β·`contracts:write` λ“±μž…λ‹ˆλ‹€. 미보유 μ‹œ `…/insufficient-scope`. - **λŒ€ν–‰ λ²”μœ„** = *λˆ„κ΅¬μ˜ 데이터λ₯Ό λ‹€λ£° 수 μžˆλ‚˜*. API ν‚€ 섀정이며 μŠ€μ½”ν”„λ‘œ ν‘œν˜„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ²”μœ„ 밖이면 μŠ€μ½”ν”„μ™€ λ¬΄κ΄€ν•˜κ²Œ 403μž…λ‹ˆλ‹€. λŒ€ν–‰ λ²”μœ„λŠ” ν‚€λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ‘œ μ„€μ •λ©λ‹ˆλ‹€ β€” **μ†Œμ† κ·Έλ£Ή 전원**(κΈ°κ΄€ ν‚€. μ‚¬μ—…μ²˜Β·λΆ€μ„œ 계정이 μƒˆλ‘œ 생겨도 μžλ™ 포함) λ˜λŠ” **μ§€μ • λ°œμ£ΌκΈ°κ΄€ λͺ©λ‘**(κ³„μ•½μœΌλ‘œ ν•©μ˜λœ λͺ©λ‘). λ²”μœ„λ₯Ό λ„“ν˜€μ•Ό ν•˜λ©΄ μŠ€μ½”ν”„κ°€ μ•„λ‹ˆλΌ ν‚€ μ„€μ • 변경을 μš”μ²­ν•˜μ„Έμš”. ## 성곡 응닡 ν˜•μ‹ `/v2`의 λͺ¨λ“  2xx 본문은 `{ \"data\": … }`μž…λ‹ˆλ‹€. 단일 λ¦¬μ†ŒμŠ€λ“  λͺ©λ‘μ΄λ“  κ°™μŠ΅λ‹ˆλ‹€. **λͺ©λ‘μ€ `data`κ°€ 배열이고 `meta`κ°€ 항상 ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€** β€” `{ \"data\": [...], \"meta\": { \"nextCursor\": \"Mg==\", \"hasMore\": true } }`. 단일 λ¦¬μ†ŒμŠ€ μ‘λ‹΅μ—λŠ” `meta`κ°€ λ‚˜κ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 ν˜•μ‹μ„ μ“°μ§€ μ•ŠλŠ” μ—”λ“œν¬μΈνŠΈλŠ” λ‘˜μž…λ‹ˆλ‹€. `/oauth/_*`와 `/.well-known/_*`λŠ” 각각 RFC 6749Β·RFC 8414Β·RFC 9728이 μ΅œμƒμœ„ ν•„λ“œλ₯Ό κ·œμ •ν•˜κ³ , 파일 λ‚΄μš© 응닡은 본문이 JSON이 μ•„λ‹™λ‹ˆλ‹€. μ—λŸ¬ μ‘λ‹΅μ—λŠ” 이 ν˜•μ‹μ„ μ”Œμš°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ β€” μ•„λž˜ problem+json이 λ‹¨λ…μœΌλ‘œ μ±…μž„μ§‘λ‹ˆλ‹€. ## 쑰건뢀 μš”μ²­ (ETag) `/v2`의 λͺ¨λ“  `GET` 응닡에 weak `ETag`(`W/\"…\"`)κ°€ μ‹€λ¦½λ‹ˆλ‹€. 받은 값을 λ‹€μŒ μš”μ²­μ˜ `If-None-Match` ν—€λ”λ‘œ λ˜λ³΄λ‚΄λ©΄, λ‚΄μš©μ΄ κ·ΈλŒ€λ‘œμΌ λ•Œ `304 Not Modified`λ₯Ό λ³Έλ¬Έ 없이 λ°›μŠ΅λ‹ˆλ‹€. κ²°κ³Όκ°€ λ‚˜κΈ°λ₯Ό 기닀리며 같은 μžμ›μ„ 반볡 μ‘°νšŒν•˜λŠ” 연동이라면 이 헀더 ν•˜λ‚˜λ‘œ μ „μ†‘λŸ‰μ΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. ## μ—λŸ¬ (RFC 9457 problem+json) λͺ¨λ“  μ—λŸ¬ 응닡은 `application/problem+json`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 409와 422의 차이 - `409` `…/idempotency-key-conflict` β€” 같은 ν‚€μ˜ **원 μš”μ²­μ΄ 아직 처리 쀑**μž…λ‹ˆλ‹€. μž μ‹œ λ’€ 같은 ν‚€λ‘œ λ‹€μ‹œ λΆ€λ₯΄λ©΄ κ·Έ κ²°κ³Όλ₯Ό λ°›μŠ΅λ‹ˆλ‹€. - `422` `…/idempotency-key-reused` β€” 같은 ν‚€λ₯Ό **λ‹€λ₯Έ body** 둜 λ³΄λƒˆμŠ΅λ‹ˆλ‹€. μž¬μ‹œλ„ν•΄λ„ μ˜μ›νžˆ 같은 μ‹€νŒ¨μ΄λ‹ˆ μƒˆ ν‚€λ₯Ό μ“°κ±°λ‚˜ bodyλ₯Ό λ˜λŒλ¦¬μ„Έμš”. ## Rate Limit μ „μ—­ **60 μš”μ²­/λΆ„ per `client_id`**, 토큰 λ°œκΈ‰(`/oauth/token`)은 **5 μš”μ²­/λΆ„** μž…λ‹ˆλ‹€. 초과 μ‹œ `429`(`type: …/too-many-requests`). μΏΌν„°λŠ” 두 κ°€μ§€ ν‘œκΈ°λ‘œ ν•¨κ»˜ λ‚˜κ°‘λ‹ˆλ‹€ β€” μ‹ κ·œ 연동은 ν‘œμ€€ ν•„λ“œλ₯Ό μ“°μ„Έμš”. - **ν‘œμ€€**(`draft-ietf-httpapi-ratelimit-headers`, Structured Fields): `RateLimit-Policy: \"default\";q=60;w=60` (μ •μ±…) Β· `RateLimit: \"default\";r=59;t=42` (μž”λŸ‰ r, λ¦¬μ…‹κΉŒμ§€ t 초) - **λ ˆκ±°μ‹œ**(κ΄€μš©): `X-RateLimit-Limit` / `X-RateLimit-Remaining` / `X-RateLimit-Reset`. κΈ°μ‘΄ 연동 ν˜Έν™˜μ„ μœ„ν•΄ μœ μ§€ν•©λ‹ˆλ‹€. `429` μ—μ„œλŠ” `Retry-After`(초)κ°€ μš°μ„ ν•©λ‹ˆλ‹€. λŒ€λŸ‰ 동기화(ν’ˆλͺ© λ‹¨μœ„ 반볡 등둝 λ“±)λŠ” `Retry-After` 만큼 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. ## 좔적 μš”μ²­μ— `X-Correlation-Id` 헀더λ₯Ό μ‹€μœΌλ©΄ κ·ΈλŒ€λ‘œ echo 되고, μ—†μœΌλ©΄ μ„œλ²„κ°€ λ°œκΈ‰ν•©λ‹ˆλ‹€. λͺ¨λ“  응닡(성곡/μ—λŸ¬)에 `X-Correlation-Id`κ°€ μ‹€λ¦½λ‹ˆλ‹€. ## μ „λ°©ν˜Έν™˜ β€” λͺ¨λ₯΄λŠ” ν•„λ“œμ™€ κ°’μ—μ„œ κΉ¨μ§€μ§€ μ•Šκ²Œ λ‹€μŒ 셋은 breaking λ³€κ²½μœΌλ‘œ 보지 μ•ŠμœΌλ©° minor λ¦΄λ¦¬μŠ€μ—μ„œ 예고 없이 μΌμ–΄λ‚©λ‹ˆλ‹€. 이 μ „μ œλ‘œ κ΅¬ν˜„ν•˜μ„Έμš”. - **선택 ν•„λ“œ μΆ”κ°€**: λͺ¨λ₯΄λŠ” ν•„λ“œλŠ” λ¬΄μ‹œν•˜μ„Έμš”. 엄격 νŒŒμ„œ(unknown key κ±°λΆ€)λ₯Ό μ“°μ§€ λ§ˆμ„Έμš”. - **enum κ°’ μΆ”κ°€**: μƒνƒœΒ·λ‚™μ°°λ°©λ²• 등에 μƒˆ 값이 μƒκΉλ‹ˆλ‹€. λͺ¨λ₯΄λŠ” 값을 λ§Œλ‚˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€μ§€ 말고 원문 λ¬Έμžμ—΄μ„ λ³΄μ‘΄ν•˜μ„Έμš”. - **problem `type` slug μΆ”κ°€**: λͺ¨λ₯΄λŠ” slug은 **HTTP status둜 폴백**ν•΄ λΆ„κΈ°ν•˜μ„Έμš”. ## 버전 수λͺ…(deprecation/sunset) - **_/v2** breaking 변경은 CHANGELOG SemVer(major bump)와 `Deprecation`/`Sunset` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
7
7
  *
8
- * The version of the OpenAPI document: 50.2.0
8
+ * The version of the OpenAPI document: 50.3.0
9
9
  * Contact: semo.io.kr@gmail.com
10
10
  *
11
11
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -42,7 +42,7 @@ export declare const OauthApiAxiosParamCreator: (configuration?: Configuration)
42
42
  revoke: (revokeRequestDto: RevokeRequestDto, options?: RawAxiosRequestConfig) => Promise<RequestArgs>;
43
43
  /**
44
44
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
45
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
45
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
46
46
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
47
47
  * @param {*} [options] Override http request option.
48
48
  * @throws {RequiredError}
@@ -86,7 +86,7 @@ export declare const OauthApiFp: (configuration?: Configuration) => {
86
86
  revoke(revokeRequestDto: RevokeRequestDto, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>>;
87
87
  /**
88
88
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
89
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
89
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
90
90
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
91
91
  * @param {*} [options] Override http request option.
92
92
  * @throws {RequiredError}
@@ -130,7 +130,7 @@ export declare const OauthApiFactory: (configuration?: Configuration, basePath?:
130
130
  revoke(revokeRequestDto: RevokeRequestDto, options?: RawAxiosRequestConfig): AxiosPromise<void>;
131
131
  /**
132
132
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
133
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
133
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
134
134
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
135
135
  * @param {*} [options] Override http request option.
136
136
  * @throws {RequiredError}
@@ -174,7 +174,7 @@ export declare class OauthApi extends BaseAPI {
174
174
  revoke(revokeRequestDto: RevokeRequestDto, options?: RawAxiosRequestConfig): Promise<import("axios").AxiosResponse<void, any, {}>>;
175
175
  /**
176
176
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
177
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
177
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
178
178
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
179
179
  * @param {*} [options] Override http request option.
180
180
  * @throws {RequiredError}
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
@@ -95,7 +95,7 @@ export const OauthApiAxiosParamCreator = function (configuration) {
95
95
  }),
96
96
  /**
97
97
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
98
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
98
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
99
99
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
100
100
  * @param {*} [options] Override http request option.
101
101
  * @throws {RequiredError}
@@ -223,7 +223,7 @@ export const OauthApiFp = function (configuration) {
223
223
  },
224
224
  /**
225
225
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
226
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
226
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
227
227
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
228
228
  * @param {*} [options] Override http request option.
229
229
  * @throws {RequiredError}
@@ -298,7 +298,7 @@ export const OauthApiFactory = function (configuration, basePath, axios) {
298
298
  },
299
299
  /**
300
300
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
301
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
301
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
302
302
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
303
303
  * @param {*} [options] Override http request option.
304
304
  * @throws {RequiredError}
@@ -353,7 +353,7 @@ export class OauthApi extends BaseAPI {
353
353
  }
354
354
  /**
355
355
  * μ§€κΈˆ μ“°κ³  μžˆλŠ” `client_secret`을 μ œμ‹œν•˜κ³  μƒˆ 값을 λ°›μŠ΅λ‹ˆλ‹€. 직전 secret은 μ‘λ‹΅μ˜ `previous_secret_expires_at`κΉŒμ§€ ν•¨κ»˜ ν†΅ν•˜λ―€λ‘œ 연동을 λ©ˆμΆ”μ§€ μ•Šκ³  ꡐ체할 수 μžˆμŠ΅λ‹ˆλ‹€. μœ μΆœμ„ 확인해 **μ¦‰μ‹œ** λŠμ–΄μ•Ό ν•œλ‹€λ©΄ νšŒμ „μ΄ μ•„λ‹ˆλΌ μ”¨λ§ˆμΌ“ λ‹΄λ‹Ήμžμ—κ²Œ ν‚€ 폐기λ₯Ό μš”μ²­ν•˜μ„Έμš”.
356
- * @summary 자격증λͺ… μž¬λ°œκΈ‰ (client_secret μžκ°€νšŒμ „)
356
+ * @summary 연동 ν‚€ μž¬λ°œκΈ‰
357
357
  * @param {RotateSecretRequestDto} rotateSecretRequestDto
358
358
  * @param {*} [options] Override http request option.
359
359
  * @throws {RequiredError}
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -4,7 +4,7 @@
4
4
  * CMARKET V6 Partner API
5
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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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: 50.2.0
7
+ * The version of the OpenAPI document: 50.3.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).
package/dist/esm/api.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * CMARKET V6 Partner API
3
3
  * μ™ΈλΆ€ 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`μž…λ‹ˆλ‹€. **좕이 μ—¬λŸ¬ 개라 μ–΄λŠ 것을 읽어야 ν•˜λŠ”μ§€ ν•œ κ³³μ—μ„œ μ •λ¦¬ν•©λ‹ˆλ‹€.** - **λΆ„κΈ°**λŠ” `status` β†’ `type` β†’ `code` μˆœμ„œλ‘œ μ’ν˜€ κ°€μ„Έμš”. μ•žμ˜ λ‘˜λ§ŒμœΌλ‘œ μΆ©λΆ„ν•œ 연동이 λŒ€λΆ€λΆ„μ΄κ³ , `code`λŠ” 같은 statusΒ·type μ•ˆμ—μ„œ μ‚¬μœ λ₯Ό κ°€λ¦…λ‹ˆλ‹€. - **ν‘œμ‹œΒ·λ‘œκ·Έ**λŠ” `title`κ³Ό `detail`을 μ“°μ„Έμš”. μ‚¬λžŒμ΄ μ½λŠ” λ¬Έμž₯이며 예고 없이 λ‹€λ“¬μŠ΅λ‹ˆλ‹€ β€” **λ¬Έμžμ—΄ λΉ„κ΅λ‘œ λΆ„κΈ°ν•˜μ§€ λ§ˆμ„Έμš”**. - **μž¬μ‹œλ„**λŠ” `Retry-After` 헀더가 있으면 κ·Έ 값을, μ—†μœΌλ©΄ `retryable`을, 그것도 μ—†μœΌλ©΄ `status`λ₯Ό λ”°λ₯΄μ„Έμš”. - **문의**ν•  λ•ŒλŠ” `traceId`λ₯Ό μ²¨λΆ€ν•˜μ„Έμš”. - `retryable`(boolean): μžλ™ μž¬μ‹œλ„ μ•ˆμ „ μ—¬λΆ€. `true`(429Β·5xx transient)λ©΄ backoff ν›„ μž¬μ‹œλ„ν•˜κ³ , `false`λ©΄ μš”μ²­μ„ 고쳐야 ν•©λ‹ˆλ‹€. - `traceId`: μš”μ²­ 좔적 id. `X-Correlation-Id` 응닡 헀더와 같은 κ°’μž…λ‹ˆλ‹€ β€” λ¬Έμ˜ν•  λ•Œ 이 값을 μ²¨λΆ€ν•˜μ„Έμš”. - `correlationId`: `traceId`와 같은 κ°’μ˜ μ˜› 이름. κΈ°μ‘΄ 연동 ν˜Έν™˜μœΌλ‘œ ν•¨κ»˜ μ‹€λ¦½λ‹ˆλ‹€. μƒˆ 연동은 `traceId`λ₯Ό μ½μœΌμ„Έμš”. - `invalid-params`: 검증 μ‹€νŒ¨(400 `…/validation-failed`) μ‹œ μœ„λ°˜ ν•„λ“œ 경둜 λͺ©λ‘(RFC 9457 ν™•μž₯, κ°’ μ—†μŒ). - `code`: μ‘°λ‹¬ν”Œλž«νΌμ΄ μš”μ²­μ„ κ±°λΆ€ν•œ **μ‚¬μœ  μ½”λ“œ**(`…/upstream-*` 응닡에 ν•¨κ»˜ μ˜΅λ‹ˆλ‹€). `type`은 μƒνƒœ μˆ˜μ€€μ΄κ³  `detail`은 κ³ μ • 문ꡬ라, 무엇을 고쳐야 ν•˜λŠ”μ§€λŠ” 이 값이 μ•Œλ € μ€λ‹ˆλ‹€ β€” 예: `BID_INVALID_BID_DATE_RANGE`(마감이 μ‹œμž‘λ³΄λ‹€ 이름), `BID_DUPLICATE_PURCHASE_NO`(같은 μ‘°λ‹¬λ²ˆν˜Έμ˜ 곡고가 μ§„ν–‰ 쀑). μ•ˆμ • μ‹λ³„μžμ΄λ―€λ‘œ λ¬Έμžμ—΄λ‘œ 뢄기해도 λ©λ‹ˆλ‹€. `type`은 `https://problems.cmarket.io/partner/<slug>` ν˜•νƒœμ˜ **μ•ˆμ • μ‹λ³„μž**μž…λ‹ˆλ‹€. RFC 9457 Β§3.1.1이 ν—ˆμš©ν•˜λŠ” λŒ€λ‘œ 이 URIλŠ” **μ—­μ°Έμ‘°(dereference)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€** β€” λΈŒλΌμš°μ €λ‘œ μ—΄μ§€ 말고 λ¬Έμžμ—΄ λΉ„κ΅λ‘œλ§Œ μ“°μ„Έμš”. slug λͺ©λ‘κ³Ό μ˜λ―ΈλŠ” 각 μ—”λ“œν¬μΈνŠΈμ˜ 응닡 μ„€λͺ…에 status λ³„λ‘œ μ ν˜€ μžˆμŠ΅λ‹ˆλ‹€. ### 502와 4xx의 차이 - `502` `…/upstream-unavailable` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μΌμ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.** μš”μ²­μ€ κ·ΈλŒ€λ‘œ 두고 backoff ν›„ μž¬μ‹œλ„ν•˜μ„Έμš”. - `4xx` `…/upstream-*` β€” μ‘°λ‹¬ν”Œλž«νΌμ΄ **μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.** 같은 μš”μ²­μ„ λ‹€μ‹œ 보내도 κ²°κ³ΌλŠ” κ°™μŠ΅λ‹ˆλ‹€. `code`의 μ‚¬μœ λ₯Ό 보고 μš”μ²­μ„ κ³ μΉ˜μ„Έμš”. ### λ©±λ“±μ„± μœ„λ°˜: 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` ν—€λ”λ‘œ ν†΅μ§€ν•©λ‹ˆλ‹€. 이 헀더λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ„Έμš”.
4
4
  *
5
- * The version of the OpenAPI document: 50.2.0
5
+ * The version of the OpenAPI document: 50.3.0
6
6
  * Contact: semo.io.kr@gmail.com
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).