pinelabs-python 0.1.0__py3-none-any.whl

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 (626) hide show
  1. pinelabs/__init__.py +1679 -0
  2. pinelabs/_default_clients.py +30 -0
  3. pinelabs/affordability_suite/__init__.py +325 -0
  4. pinelabs/affordability_suite/client.py +1007 -0
  5. pinelabs/affordability_suite/raw_client.py +1095 -0
  6. pinelabs/affordability_suite/types/__init__.py +477 -0
  7. pinelabs/affordability_suite/types/downpayment_details_request_issuer.py +26 -0
  8. pinelabs/affordability_suite/types/imei_validation_request_request_type.py +5 -0
  9. pinelabs/affordability_suite/types/offer_discovery_cardless_request_payment_option.py +29 -0
  10. pinelabs/affordability_suite/types/offer_discovery_cardless_request_payment_option_cardless_details.py +31 -0
  11. pinelabs/affordability_suite/types/offer_discovery_request_cart_coupon_discount_amount.py +31 -0
  12. pinelabs/affordability_suite/types/offer_discovery_request_customer_details.py +26 -0
  13. pinelabs/affordability_suite/types/offer_discovery_request_downpayment_details.py +31 -0
  14. pinelabs/affordability_suite/types/offer_discovery_request_downpayment_details_downpayment_amount.py +31 -0
  15. pinelabs/affordability_suite/types/offer_discovery_request_issuer.py +42 -0
  16. pinelabs/affordability_suite/types/offer_discovery_request_issuer_issuer_type.py +10 -0
  17. pinelabs/affordability_suite/types/offer_discovery_request_order_amount.py +31 -0
  18. pinelabs/affordability_suite/types/offer_discovery_request_payment_options.py +37 -0
  19. pinelabs/affordability_suite/types/offer_discovery_request_payment_options_card_details.py +26 -0
  20. pinelabs/affordability_suite/types/offer_discovery_request_payment_options_card_token_details.py +31 -0
  21. pinelabs/affordability_suite/types/offer_discovery_request_product_details_item.py +40 -0
  22. pinelabs/affordability_suite/types/offer_discovery_request_product_details_item_product_amount.py +31 -0
  23. pinelabs/affordability_suite/types/offer_discovery_request_product_details_item_product_coupon_discount_amount.py +31 -0
  24. pinelabs/affordability_suite/types/offer_validation_request_customer_details.py +26 -0
  25. pinelabs/affordability_suite/types/offer_validation_request_offer_data.py +27 -0
  26. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details.py +52 -0
  27. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure.py +146 -0
  28. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_auth_amount.py +20 -0
  29. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_cart_coupon_discount_amount.py +20 -0
  30. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown.py +60 -0
  31. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_additional_fee_amount.py +20 -0
  32. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_applicable_fee_amount.py +20 -0
  33. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_fee_amount.py +20 -0
  34. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_fee_calculated_on_amount.py +20 -0
  35. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_maximum_fee_amount.py +20 -0
  36. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_subvented_fee_amount.py +20 -0
  37. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_convenience_fee_breakdown_tax_amount.py +20 -0
  38. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item.py +119 -0
  39. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_after_downpayment_reduced_product_amount.py +22 -0
  40. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_cart_coupon_discount_product_share.py +20 -0
  41. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount.py +48 -0
  42. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup.py +36 -0
  43. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_brand.py +24 -0
  44. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_brand_amount.py +20 -0
  45. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_dealer.py +24 -0
  46. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_dealer_amount.py +20 -0
  47. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_issuer.py +24 -0
  48. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_issuer_amount.py +20 -0
  49. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_merchant.py +24 -0
  50. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_breakup_merchant_amount.py +20 -0
  51. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_max_amount.py +20 -0
  52. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_discount_min_amount.py +20 -0
  53. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_downpayment_amount.py +20 -0
  54. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_interest_amount.py +20 -0
  55. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_product_amount.py +31 -0
  56. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_product_coupon_discount_amount.py +24 -0
  57. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_product_offer_parameters_item.py +32 -0
  58. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention.py +40 -0
  59. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_amount.py +20 -0
  60. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup.py +36 -0
  61. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_brand.py +24 -0
  62. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_brand_amount.py +20 -0
  63. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_dealer.py +24 -0
  64. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_dealer_amount.py +20 -0
  65. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_issuer.py +24 -0
  66. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_issuer_amount.py +20 -0
  67. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_merchant.py +24 -0
  68. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_breakup_merchant_amount.py +20 -0
  69. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_max_amount.py +20 -0
  70. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_details_item_subvention_min_amount.py +20 -0
  71. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount.py +40 -0
  72. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup.py +34 -0
  73. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_brand.py +22 -0
  74. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_brand_amount.py +20 -0
  75. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_dealer.py +22 -0
  76. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_dealer_amount.py +20 -0
  77. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_issuer.py +22 -0
  78. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_issuer_amount.py +20 -0
  79. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_merchant.py +22 -0
  80. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_breakup_merchant_amount.py +20 -0
  81. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_max_amount.py +20 -0
  82. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_discount_min_amount.py +20 -0
  83. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_downpayment_details.py +28 -0
  84. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_downpayment_details_downpayment_amount.py +20 -0
  85. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_interest_amount.py +20 -0
  86. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_loan_amount.py +20 -0
  87. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_monthly_emi_amount.py +20 -0
  88. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_net_payment_amount.py +20 -0
  89. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_processing_fee_amount.py +20 -0
  90. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_processing_fee_details.py +22 -0
  91. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_processing_fee_details_amount.py +20 -0
  92. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_split_emi_amount.py +20 -0
  93. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_total_coupon_discount.py +20 -0
  94. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_total_discount_amount.py +20 -0
  95. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_total_emi_amount.py +20 -0
  96. pinelabs/affordability_suite/types/offer_validation_request_offer_data_offer_details_tenure_total_subvention_amount.py +20 -0
  97. pinelabs/affordability_suite/types/offer_validation_request_order_amount.py +31 -0
  98. pinelabs/affordability_suite/types/offer_validation_request_payment_amount.py +31 -0
  99. pinelabs/affordability_suite/types/offer_validation_request_payment_option.py +43 -0
  100. pinelabs/affordability_suite/types/offer_validation_request_payment_option_card_details.py +31 -0
  101. pinelabs/affordability_suite/types/offer_validation_request_payment_option_card_token_details.py +46 -0
  102. pinelabs/affordability_suite/types/offer_validation_request_payment_option_cardless_details.py +31 -0
  103. pinelabs/apple_pay/__init__.py +49 -0
  104. pinelabs/apple_pay/client.py +190 -0
  105. pinelabs/apple_pay/raw_client.py +283 -0
  106. pinelabs/apple_pay/types/__init__.py +53 -0
  107. pinelabs/apple_pay/types/authorize_payment_request_decrypted_card_details.py +62 -0
  108. pinelabs/apple_pay/types/authorize_payment_request_decrypted_card_details_card_meta_data.py +37 -0
  109. pinelabs/apple_pay/types/authorize_payment_request_decrypted_card_details_card_meta_data_card_type.py +7 -0
  110. pinelabs/apple_pay/types/authorize_payment_request_decrypted_card_details_card_meta_data_network_name.py +7 -0
  111. pinelabs/authentication/__init__.py +4 -0
  112. pinelabs/authentication/client.py +155 -0
  113. pinelabs/authentication/raw_client.py +226 -0
  114. pinelabs/bnpl/__init__.py +46 -0
  115. pinelabs/bnpl/client.py +200 -0
  116. pinelabs/bnpl/raw_client.py +273 -0
  117. pinelabs/bnpl/types/__init__.py +46 -0
  118. pinelabs/bnpl/types/bnpl_check_eligibility_request_device_info.py +56 -0
  119. pinelabs/bnpl/types/bnpl_check_eligibility_request_device_info_operating_system.py +7 -0
  120. pinelabs/bnpl/types/bnpl_check_eligibility_request_pay_code.py +5 -0
  121. pinelabs/card_payments/__init__.py +4 -0
  122. pinelabs/card_payments/client.py +547 -0
  123. pinelabs/card_payments/raw_client.py +1085 -0
  124. pinelabs/checkout/__init__.py +37 -0
  125. pinelabs/checkout/client.py +225 -0
  126. pinelabs/checkout/raw_client.py +318 -0
  127. pinelabs/checkout/types/__init__.py +40 -0
  128. pinelabs/checkout/types/generate_checkout_link_request_allowed_payment_methods_item.py +7 -0
  129. pinelabs/checkout/types/generate_checkout_link_request_integration_mode.py +5 -0
  130. pinelabs/client.py +612 -0
  131. pinelabs/convenience_fee/__init__.py +4 -0
  132. pinelabs/convenience_fee/client.py +156 -0
  133. pinelabs/convenience_fee/raw_client.py +247 -0
  134. pinelabs/core/__init__.py +127 -0
  135. pinelabs/core/api_error.py +23 -0
  136. pinelabs/core/client_wrapper.py +132 -0
  137. pinelabs/core/datetime_utils.py +70 -0
  138. pinelabs/core/file.py +67 -0
  139. pinelabs/core/force_multipart.py +18 -0
  140. pinelabs/core/http_client.py +840 -0
  141. pinelabs/core/http_response.py +59 -0
  142. pinelabs/core/http_sse/__init__.py +42 -0
  143. pinelabs/core/http_sse/_api.py +112 -0
  144. pinelabs/core/http_sse/_decoders.py +61 -0
  145. pinelabs/core/http_sse/_exceptions.py +7 -0
  146. pinelabs/core/http_sse/_models.py +17 -0
  147. pinelabs/core/jsonable_encoder.py +120 -0
  148. pinelabs/core/logging.py +107 -0
  149. pinelabs/core/parse_error.py +36 -0
  150. pinelabs/core/pydantic_utilities.py +634 -0
  151. pinelabs/core/query_encoder.py +58 -0
  152. pinelabs/core/remove_none_from_dict.py +11 -0
  153. pinelabs/core/request_options.py +35 -0
  154. pinelabs/core/serialization.py +276 -0
  155. pinelabs/customers/__init__.py +34 -0
  156. pinelabs/customers/client.py +590 -0
  157. pinelabs/customers/raw_client.py +1061 -0
  158. pinelabs/customers/types/__init__.py +34 -0
  159. pinelabs/customers/types/update_customer_request_status.py +5 -0
  160. pinelabs/e_challans/__init__.py +55 -0
  161. pinelabs/e_challans/client.py +323 -0
  162. pinelabs/e_challans/raw_client.py +386 -0
  163. pinelabs/e_challans/types/__init__.py +63 -0
  164. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown.py +67 -0
  165. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown_additional_fee_amount.py +32 -0
  166. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown_applicable_fee_amount.py +32 -0
  167. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown_fee_amount.py +32 -0
  168. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown_maximum_fee_amount.py +32 -0
  169. pinelabs/e_challans/types/create_challan_request_convenience_fee_breakdown_tax_amount.py +32 -0
  170. pinelabs/environment.py +7 -0
  171. pinelabs/errors/__init__.py +62 -0
  172. pinelabs/errors/bad_request_error.py +10 -0
  173. pinelabs/errors/conflict_error.py +11 -0
  174. pinelabs/errors/forbidden_error.py +11 -0
  175. pinelabs/errors/internal_server_error.py +11 -0
  176. pinelabs/errors/method_not_allowed_error.py +11 -0
  177. pinelabs/errors/not_found_error.py +11 -0
  178. pinelabs/errors/service_unavailable_error.py +11 -0
  179. pinelabs/errors/unauthorized_error.py +11 -0
  180. pinelabs/errors/unprocessable_entity_error.py +10 -0
  181. pinelabs/international_payments/__init__.py +4 -0
  182. pinelabs/international_payments/client.py +187 -0
  183. pinelabs/international_payments/raw_client.py +201 -0
  184. pinelabs/orders/__init__.py +37 -0
  185. pinelabs/orders/client.py +613 -0
  186. pinelabs/orders/raw_client.py +1132 -0
  187. pinelabs/orders/types/__init__.py +38 -0
  188. pinelabs/orders/types/create_order_request_allowed_payment_methods_item.py +8 -0
  189. pinelabs/orders/types/create_order_request_purchase_details.py +28 -0
  190. pinelabs/pay_by_points/__init__.py +49 -0
  191. pinelabs/pay_by_points/client.py +177 -0
  192. pinelabs/pay_by_points/raw_client.py +246 -0
  193. pinelabs/pay_by_points/types/__init__.py +49 -0
  194. pinelabs/pay_by_points/types/check_point_balance_request_order_details.py +27 -0
  195. pinelabs/pay_by_points/types/check_point_balance_request_order_details_order_amount.py +31 -0
  196. pinelabs/pay_by_points/types/check_point_balance_request_payment_option.py +26 -0
  197. pinelabs/pay_by_points/types/check_point_balance_request_payment_option_points_card_details.py +32 -0
  198. pinelabs/payment_links/__init__.py +34 -0
  199. pinelabs/payment_links/client.py +642 -0
  200. pinelabs/payment_links/raw_client.py +797 -0
  201. pinelabs/payment_links/types/__init__.py +38 -0
  202. pinelabs/payment_links/types/create_payment_link_request_allowed_payment_methods_item.py +7 -0
  203. pinelabs/payouts/__init__.py +38 -0
  204. pinelabs/payouts/client.py +810 -0
  205. pinelabs/payouts/raw_client.py +1427 -0
  206. pinelabs/payouts/types/__init__.py +40 -0
  207. pinelabs/payouts/types/create_payout_request_mode.py +5 -0
  208. pinelabs/payouts/types/list_payouts_request_mode.py +5 -0
  209. pinelabs/payouts/types/list_payouts_request_status.py +7 -0
  210. pinelabs/refunds/__init__.py +52 -0
  211. pinelabs/refunds/client.py +211 -0
  212. pinelabs/refunds/raw_client.py +324 -0
  213. pinelabs/refunds/types/__init__.py +52 -0
  214. pinelabs/refunds/types/create_refund_request_order_amount.py +31 -0
  215. pinelabs/refunds/types/create_refund_request_products_item.py +27 -0
  216. pinelabs/refunds/types/create_refund_request_split_info.py +29 -0
  217. pinelabs/refunds/types/create_refund_request_split_info_split_details_item.py +32 -0
  218. pinelabs/refunds/types/create_refund_request_split_info_split_details_item_amount.py +20 -0
  219. pinelabs/settlements/__init__.py +4 -0
  220. pinelabs/settlements/client.py +283 -0
  221. pinelabs/settlements/raw_client.py +421 -0
  222. pinelabs/split_settlements/__init__.py +34 -0
  223. pinelabs/split_settlements/client.py +254 -0
  224. pinelabs/split_settlements/raw_client.py +414 -0
  225. pinelabs/split_settlements/types/__init__.py +36 -0
  226. pinelabs/split_settlements/types/release_settlement_request_release_amount.py +31 -0
  227. pinelabs/subscriptions_plans/__init__.py +37 -0
  228. pinelabs/subscriptions_plans/client.py +872 -0
  229. pinelabs/subscriptions_plans/raw_client.py +1111 -0
  230. pinelabs/subscriptions_plans/types/__init__.py +38 -0
  231. pinelabs/subscriptions_plans/types/create_plan_request_frequency.py +10 -0
  232. pinelabs/subscriptions_plans/types/list_plans_request_amount_range.py +5 -0
  233. pinelabs/subscriptions_presentations/__init__.py +4 -0
  234. pinelabs/subscriptions_presentations/client.py +886 -0
  235. pinelabs/subscriptions_presentations/raw_client.py +1168 -0
  236. pinelabs/subscriptions_subscriptions/__init__.py +46 -0
  237. pinelabs/subscriptions_subscriptions/client.py +1014 -0
  238. pinelabs/subscriptions_subscriptions/raw_client.py +1281 -0
  239. pinelabs/subscriptions_subscriptions/types/__init__.py +46 -0
  240. pinelabs/subscriptions_subscriptions/types/create_subscription_request_allowed_payment_methods_item.py +7 -0
  241. pinelabs/subscriptions_subscriptions/types/create_subscription_request_integration_mode.py +5 -0
  242. pinelabs/subscriptions_subscriptions/types/list_subscriptions_request_amount_range.py +5 -0
  243. pinelabs/tokenization/__init__.py +37 -0
  244. pinelabs/tokenization/client.py +809 -0
  245. pinelabs/tokenization/raw_client.py +1643 -0
  246. pinelabs/tokenization/types/__init__.py +38 -0
  247. pinelabs/tokenization/types/generate_card_token_request_payment_method.py +5 -0
  248. pinelabs/tokenization/types/get_service_provider_token_response.py +8 -0
  249. pinelabs/types/__init__.py +1320 -0
  250. pinelabs/types/acquirer_data.py +41 -0
  251. pinelabs/types/address.py +72 -0
  252. pinelabs/types/address_address_category.py +5 -0
  253. pinelabs/types/amount.py +31 -0
  254. pinelabs/types/authorize_payment_response.py +24 -0
  255. pinelabs/types/authorize_payment_response_data.py +45 -0
  256. pinelabs/types/authorize_payment_response_data_integration_mode.py +5 -0
  257. pinelabs/types/authorize_payment_response_data_order_amount.py +20 -0
  258. pinelabs/types/authorize_payment_response_data_payments_item.py +41 -0
  259. pinelabs/types/authorize_payment_response_data_payments_item_acquirer_data.py +23 -0
  260. pinelabs/types/authorize_payment_response_data_payments_item_payment_amount.py +20 -0
  261. pinelabs/types/authorize_payment_response_data_payments_item_payment_method.py +7 -0
  262. pinelabs/types/authorize_payment_response_data_payments_item_payment_option.py +22 -0
  263. pinelabs/types/authorize_payment_response_data_payments_item_payment_option_wallet_data.py +25 -0
  264. pinelabs/types/authorize_payment_response_data_payments_item_payment_option_wallet_data_wallet_card_data.py +38 -0
  265. pinelabs/types/authorize_payment_response_data_payments_item_payment_option_wallet_data_wallet_card_data_card_type.py +7 -0
  266. pinelabs/types/authorize_payment_response_data_payments_item_payment_option_wallet_data_wallet_card_data_token_txn_type.py +7 -0
  267. pinelabs/types/authorize_payment_response_data_payments_item_status.py +7 -0
  268. pinelabs/types/authorize_payment_response_data_purchase_details.py +24 -0
  269. pinelabs/types/authorize_payment_response_data_purchase_details_customer.py +27 -0
  270. pinelabs/types/authorize_payment_response_data_status.py +18 -0
  271. pinelabs/types/authorize_payment_response_data_type.py +5 -0
  272. pinelabs/types/bank_account.py +36 -0
  273. pinelabs/types/bnpl_check_eligibility_response.py +32 -0
  274. pinelabs/types/bnpl_check_eligibility_response_metadata.py +36 -0
  275. pinelabs/types/bnpl_check_eligibility_response_metadata_installments_item.py +33 -0
  276. pinelabs/types/bnpl_resend_otp_response.py +37 -0
  277. pinelabs/types/bnpl_resend_otp_response_meta_data.py +26 -0
  278. pinelabs/types/bnpl_submit_otp_response.py +26 -0
  279. pinelabs/types/calculate_convenience_fee_response.py +27 -0
  280. pinelabs/types/calculate_convenience_fee_response_data_item.py +50 -0
  281. pinelabs/types/calculate_convenience_fee_response_data_item_convenience_fee_breakdown.py +28 -0
  282. pinelabs/types/calculate_convenience_fee_response_data_item_payment_method_metadata.py +31 -0
  283. pinelabs/types/capture_data_item.py +34 -0
  284. pinelabs/types/card_data.py +76 -0
  285. pinelabs/types/card_data_card_category.py +22 -0
  286. pinelabs/types/card_data_card_type.py +21 -0
  287. pinelabs/types/card_data_token_txn_type.py +5 -0
  288. pinelabs/types/card_detail_lookup_item.py +35 -0
  289. pinelabs/types/card_detail_lookup_item_payment_reference_type.py +7 -0
  290. pinelabs/types/card_payment_detail_item.py +66 -0
  291. pinelabs/types/card_token_response.py +49 -0
  292. pinelabs/types/cart_details.py +27 -0
  293. pinelabs/types/cart_item.py +66 -0
  294. pinelabs/types/challan_response.py +77 -0
  295. pinelabs/types/check_point_balance_response.py +43 -0
  296. pinelabs/types/check_point_balance_response_balance.py +28 -0
  297. pinelabs/types/check_point_balance_response_redeemable_amount.py +28 -0
  298. pinelabs/types/checkout_customer.py +55 -0
  299. pinelabs/types/checkout_product.py +29 -0
  300. pinelabs/types/checkout_purchase_details.py +29 -0
  301. pinelabs/types/create_bulk_payout_response.py +48 -0
  302. pinelabs/types/create_bulk_payout_response_status.py +7 -0
  303. pinelabs/types/create_debit_response.py +56 -0
  304. pinelabs/types/create_debit_response_status.py +7 -0
  305. pinelabs/types/create_payout_response.py +100 -0
  306. pinelabs/types/create_payout_response_mode.py +5 -0
  307. pinelabs/types/create_payout_response_status.py +7 -0
  308. pinelabs/types/create_presentation_response.py +58 -0
  309. pinelabs/types/create_presentation_response_status.py +10 -0
  310. pinelabs/types/create_subscription_response.py +146 -0
  311. pinelabs/types/create_subscription_response_allowed_payment_methods_item.py +7 -0
  312. pinelabs/types/create_subscription_response_integration_mode.py +5 -0
  313. pinelabs/types/create_subscription_response_payment_mode.py +5 -0
  314. pinelabs/types/create_subscription_response_status.py +23 -0
  315. pinelabs/types/cryptogram_response.py +39 -0
  316. pinelabs/types/currency_conversion_response.py +56 -0
  317. pinelabs/types/customer_details.py +59 -0
  318. pinelabs/types/customer_response.py +83 -0
  319. pinelabs/types/customer_response_status.py +5 -0
  320. pinelabs/types/customer_token_detail.py +74 -0
  321. pinelabs/types/customer_token_detail_payment_method.py +5 -0
  322. pinelabs/types/customer_tokens_response.py +48 -0
  323. pinelabs/types/delete_customer_token_response.py +41 -0
  324. pinelabs/types/delete_token_by_token_id_response.py +31 -0
  325. pinelabs/types/downpayment_details_response.py +27 -0
  326. pinelabs/types/downpayment_details_response_downpayment_details.py +47 -0
  327. pinelabs/types/downpayment_details_response_downpayment_details_allowed_payment_methods_item.py +7 -0
  328. pinelabs/types/downpayment_details_response_downpayment_details_amount_range.py +25 -0
  329. pinelabs/types/error_response.py +41 -0
  330. pinelabs/types/error_response_additional_error_details.py +36 -0
  331. pinelabs/types/generate_checkout_link_response.py +46 -0
  332. pinelabs/types/generate_token_response.py +32 -0
  333. pinelabs/types/get_account_balance_response.py +36 -0
  334. pinelabs/types/get_card_details_response.py +27 -0
  335. pinelabs/types/get_payouts_payment_item.py +98 -0
  336. pinelabs/types/get_payouts_payment_item_mode.py +5 -0
  337. pinelabs/types/get_payouts_payment_item_status.py +7 -0
  338. pinelabs/types/get_payouts_response.py +51 -0
  339. pinelabs/types/imei_product.py +41 -0
  340. pinelabs/types/imei_validation_response.py +37 -0
  341. pinelabs/types/imei_validation_response_products_item.py +57 -0
  342. pinelabs/types/imei_validation_response_products_item_product_brand_response.py +31 -0
  343. pinelabs/types/imei_validation_response_products_item_product_imei_status.py +5 -0
  344. pinelabs/types/issuer_offer.py +59 -0
  345. pinelabs/types/issuer_offer_issuer_data.py +79 -0
  346. pinelabs/types/issuer_offer_issuer_data_auth_type.py +5 -0
  347. pinelabs/types/issuer_offer_issuer_data_penny_transaction_amount.py +20 -0
  348. pinelabs/types/issuer_offer_issuer_type.py +10 -0
  349. pinelabs/types/list_plans_response.py +31 -0
  350. pinelabs/types/list_presentations_response.py +31 -0
  351. pinelabs/types/list_settlements_response.py +42 -0
  352. pinelabs/types/list_subscriptions_response.py +31 -0
  353. pinelabs/types/merchant_metadata.py +8 -0
  354. pinelabs/types/net_banking_data_response.py +32 -0
  355. pinelabs/types/net_banking_data_response_txn_mode.py +5 -0
  356. pinelabs/types/offer_discovery_error_response.py +34 -0
  357. pinelabs/types/offer_discovery_error_response_additional_error_details.py +22 -0
  358. pinelabs/types/offer_discovery_response.py +27 -0
  359. pinelabs/types/offer_validation_error_response.py +22 -0
  360. pinelabs/types/offer_validation_error_response_additional_error_details.py +22 -0
  361. pinelabs/types/offer_validation_response.py +24 -0
  362. pinelabs/types/order_response.py +24 -0
  363. pinelabs/types/order_response_data.py +127 -0
  364. pinelabs/types/order_response_data_integration_mode.py +5 -0
  365. pinelabs/types/order_response_data_purchase_details.py +26 -0
  366. pinelabs/types/order_response_data_status.py +18 -0
  367. pinelabs/types/order_response_data_type.py +5 -0
  368. pinelabs/types/otp_generate_response.py +33 -0
  369. pinelabs/types/otp_generate_response_meta_data.py +26 -0
  370. pinelabs/types/otp_generate_response_next_item.py +5 -0
  371. pinelabs/types/page_info.py +41 -0
  372. pinelabs/types/pagination_links.py +34 -0
  373. pinelabs/types/pagination_links_first.py +22 -0
  374. pinelabs/types/pagination_links_last.py +22 -0
  375. pinelabs/types/pagination_links_next.py +22 -0
  376. pinelabs/types/pagination_links_self.py +22 -0
  377. pinelabs/types/pagination_meta.py +41 -0
  378. pinelabs/types/payment_item.py +87 -0
  379. pinelabs/types/payment_item_error_detail.py +31 -0
  380. pinelabs/types/payment_item_payment_method.py +8 -0
  381. pinelabs/types/payment_item_payment_option.py +28 -0
  382. pinelabs/types/payment_item_status.py +7 -0
  383. pinelabs/types/payment_link_account_details.py +24 -0
  384. pinelabs/types/payment_link_address.py +56 -0
  385. pinelabs/types/payment_link_bank_details.py +36 -0
  386. pinelabs/types/payment_link_cart_details.py +27 -0
  387. pinelabs/types/payment_link_cart_item.py +29 -0
  388. pinelabs/types/payment_link_customer.py +64 -0
  389. pinelabs/types/payment_link_product_detail.py +30 -0
  390. pinelabs/types/payment_link_response.py +113 -0
  391. pinelabs/types/payment_link_response_allowed_payment_methods_item.py +7 -0
  392. pinelabs/types/payment_link_response_status.py +8 -0
  393. pinelabs/types/payment_link_split_detail.py +57 -0
  394. pinelabs/types/payment_link_split_detail_status.py +5 -0
  395. pinelabs/types/payment_link_split_info.py +32 -0
  396. pinelabs/types/payment_object.py +51 -0
  397. pinelabs/types/payment_object_acquirer_data.py +23 -0
  398. pinelabs/types/payment_object_payment_amount.py +20 -0
  399. pinelabs/types/payment_object_payment_method.py +5 -0
  400. pinelabs/types/payment_object_status.py +7 -0
  401. pinelabs/types/payment_request_item.py +54 -0
  402. pinelabs/types/payment_request_item_device_info.py +53 -0
  403. pinelabs/types/payment_request_item_device_info_operating_system.py +7 -0
  404. pinelabs/types/payment_request_item_offer_data.py +27 -0
  405. pinelabs/types/payment_request_item_offer_data_offer_details.py +52 -0
  406. pinelabs/types/payment_request_item_offer_data_offer_details_tenure.py +136 -0
  407. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_auth_amount.py +20 -0
  408. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_cart_coupon_discount_amount.py +20 -0
  409. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown.py +56 -0
  410. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_additional_fee_amount.py +20 -0
  411. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_applicable_fee_amount.py +20 -0
  412. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_fee_amount.py +20 -0
  413. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_fee_calculated_on_amount.py +20 -0
  414. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_maximum_fee_amount.py +20 -0
  415. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_subvented_fee_amount.py +20 -0
  416. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_convenience_fee_breakdown_tax_amount.py +20 -0
  417. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item.py +73 -0
  418. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_after_downpayment_reduced_product_amount.py +20 -0
  419. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_cart_coupon_discount_product_share.py +20 -0
  420. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount.py +36 -0
  421. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup.py +34 -0
  422. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_brand.py +22 -0
  423. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_brand_amount.py +20 -0
  424. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_dealer.py +22 -0
  425. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_dealer_amount.py +20 -0
  426. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_issuer.py +22 -0
  427. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_issuer_amount.py +20 -0
  428. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_merchant.py +24 -0
  429. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_breakup_merchant_amount.py +20 -0
  430. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_max_amount.py +20 -0
  431. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_discount_min_amount.py +20 -0
  432. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_downpayment_amount.py +20 -0
  433. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_interest_amount.py +20 -0
  434. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_product_amount.py +20 -0
  435. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_product_coupon_discount_amount.py +20 -0
  436. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_product_offer_parameters_item.py +21 -0
  437. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention.py +36 -0
  438. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_amount.py +20 -0
  439. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup.py +34 -0
  440. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_brand.py +22 -0
  441. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_brand_amount.py +20 -0
  442. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_dealer.py +24 -0
  443. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_dealer_amount.py +20 -0
  444. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_issuer.py +24 -0
  445. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_issuer_amount.py +20 -0
  446. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_merchant.py +24 -0
  447. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_breakup_merchant_amount.py +20 -0
  448. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_max_amount.py +20 -0
  449. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_details_item_subvention_min_amount.py +20 -0
  450. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_downpayment_details.py +28 -0
  451. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_downpayment_details_downpayment_amount.py +20 -0
  452. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_intrest_amount.py +20 -0
  453. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_loan_amount.py +20 -0
  454. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_monthly_emi_amount.py +20 -0
  455. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_net_payment_amount.py +20 -0
  456. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_processing_fee_details.py +22 -0
  457. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_processing_fee_details_amount.py +20 -0
  458. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_split_emi_amount.py +20 -0
  459. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_total_coupon_discount.py +20 -0
  460. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_total_discount_amount.py +20 -0
  461. pinelabs/types/payment_request_item_offer_data_offer_details_tenure_total_emi_amount.py +20 -0
  462. pinelabs/types/payment_request_item_payment_method.py +8 -0
  463. pinelabs/types/payment_request_item_payment_option.py +53 -0
  464. pinelabs/types/payment_request_item_payment_option_bnpl_details.py +34 -0
  465. pinelabs/types/payment_request_item_payment_option_bnpl_details_bnpl_pay_code.py +5 -0
  466. pinelabs/types/payment_request_item_payment_option_card_details.py +51 -0
  467. pinelabs/types/payment_request_item_payment_option_card_token_details.py +61 -0
  468. pinelabs/types/payment_request_item_payment_option_cardless_details.py +31 -0
  469. pinelabs/types/payment_request_item_payment_option_points_card_details.py +36 -0
  470. pinelabs/types/payout_amount.py +31 -0
  471. pinelabs/types/payout_detail.py +117 -0
  472. pinelabs/types/payout_detail_mode.py +5 -0
  473. pinelabs/types/payout_detail_status.py +7 -0
  474. pinelabs/types/payout_link.py +31 -0
  475. pinelabs/types/plan_response.py +96 -0
  476. pinelabs/types/plan_response_frequency.py +10 -0
  477. pinelabs/types/plan_response_status.py +5 -0
  478. pinelabs/types/presentation_detail.py +82 -0
  479. pinelabs/types/presentation_detail_pdn_status.py +7 -0
  480. pinelabs/types/presentation_detail_status.py +18 -0
  481. pinelabs/types/product_detail.py +38 -0
  482. pinelabs/types/refund_response.py +24 -0
  483. pinelabs/types/refund_response_data.py +77 -0
  484. pinelabs/types/refund_response_data_integration_mode.py +5 -0
  485. pinelabs/types/refund_response_data_order_amount.py +20 -0
  486. pinelabs/types/refund_response_data_purchase_details.py +24 -0
  487. pinelabs/types/refund_response_data_purchase_details_customer.py +31 -0
  488. pinelabs/types/refund_response_data_purchase_details_split_info.py +21 -0
  489. pinelabs/types/refund_response_data_status.py +5 -0
  490. pinelabs/types/refund_response_data_type.py +5 -0
  491. pinelabs/types/resend_otp_error_response.py +36 -0
  492. pinelabs/types/service_provider_token_response.py +62 -0
  493. pinelabs/types/service_provider_token_response_payment_method.py +5 -0
  494. pinelabs/types/service_provider_tokens_list_response.py +32 -0
  495. pinelabs/types/settlement_by_utr_response.py +146 -0
  496. pinelabs/types/settlement_by_utr_response_pagination.py +27 -0
  497. pinelabs/types/settlement_summary.py +76 -0
  498. pinelabs/types/settlement_transaction.py +96 -0
  499. pinelabs/types/simple_amount.py +31 -0
  500. pinelabs/types/split_detail.py +55 -0
  501. pinelabs/types/split_detail_refund.py +51 -0
  502. pinelabs/types/split_detail_refund_amount.py +20 -0
  503. pinelabs/types/split_detail_refund_status.py +5 -0
  504. pinelabs/types/split_detail_status.py +5 -0
  505. pinelabs/types/split_info.py +32 -0
  506. pinelabs/types/split_payment_object.py +49 -0
  507. pinelabs/types/split_payment_object_acquirer_data.py +22 -0
  508. pinelabs/types/split_payment_object_additional_detail.py +26 -0
  509. pinelabs/types/split_payment_object_capture_data_item.py +23 -0
  510. pinelabs/types/split_payment_object_capture_data_item_capture_amount.py +20 -0
  511. pinelabs/types/split_payment_object_payment_amount.py +20 -0
  512. pinelabs/types/split_payment_object_payment_method.py +7 -0
  513. pinelabs/types/split_payment_object_payment_option.py +20 -0
  514. pinelabs/types/split_payment_object_payment_option_card_data.py +40 -0
  515. pinelabs/types/split_payment_object_payment_option_card_data_card_type.py +5 -0
  516. pinelabs/types/split_payment_object_payment_option_card_data_token_txn_type.py +7 -0
  517. pinelabs/types/split_payment_object_status.py +7 -0
  518. pinelabs/types/split_settlement_detail.py +52 -0
  519. pinelabs/types/split_settlement_detail_amount.py +20 -0
  520. pinelabs/types/split_settlement_detail_release_amount.py +24 -0
  521. pinelabs/types/split_settlement_detail_status.py +5 -0
  522. pinelabs/types/split_settlement_response.py +24 -0
  523. pinelabs/types/split_settlement_response_data.py +43 -0
  524. pinelabs/types/split_settlement_response_data_allowed_payment_methods_item.py +7 -0
  525. pinelabs/types/split_settlement_response_data_integration_mode.py +5 -0
  526. pinelabs/types/split_settlement_response_data_order_amount.py +20 -0
  527. pinelabs/types/split_settlement_response_data_purchase_details.py +26 -0
  528. pinelabs/types/split_settlement_response_data_purchase_details_customer.py +28 -0
  529. pinelabs/types/split_settlement_response_data_purchase_details_split_info.py +21 -0
  530. pinelabs/types/split_settlement_response_data_status.py +18 -0
  531. pinelabs/types/split_settlement_response_data_type.py +5 -0
  532. pinelabs/types/submit_otp_error_response.py +42 -0
  533. pinelabs/types/submit_otp_error_response_meta_data.py +26 -0
  534. pinelabs/types/subscription_amount.py +31 -0
  535. pinelabs/types/subscription_detail.py +115 -0
  536. pinelabs/types/subscription_detail_allowed_payment_methods_item.py +7 -0
  537. pinelabs/types/subscription_detail_integration_mode.py +5 -0
  538. pinelabs/types/subscription_detail_payment_mode.py +5 -0
  539. pinelabs/types/subscription_detail_status.py +23 -0
  540. pinelabs/types/subscription_notification_response.py +56 -0
  541. pinelabs/types/subscription_notification_response_pdn_status.py +7 -0
  542. pinelabs/types/subscription_notification_response_status.py +10 -0
  543. pinelabs/types/tenure.py +127 -0
  544. pinelabs/types/tenure_auth_amount.py +20 -0
  545. pinelabs/types/tenure_cart_coupon_discount_amount.py +20 -0
  546. pinelabs/types/tenure_convenience_fee_breakdown.py +38 -0
  547. pinelabs/types/tenure_convenience_fee_breakdown_additional_fee_amount.py +20 -0
  548. pinelabs/types/tenure_convenience_fee_breakdown_applicable_fee_amount.py +20 -0
  549. pinelabs/types/tenure_convenience_fee_breakdown_fee_amount.py +20 -0
  550. pinelabs/types/tenure_convenience_fee_breakdown_fee_calculated_on_amount.py +20 -0
  551. pinelabs/types/tenure_convenience_fee_breakdown_maximum_fee_amount.py +20 -0
  552. pinelabs/types/tenure_convenience_fee_breakdown_subvented_fee_amount.py +20 -0
  553. pinelabs/types/tenure_convenience_fee_breakdown_tax_amount.py +20 -0
  554. pinelabs/types/tenure_details_item.py +49 -0
  555. pinelabs/types/tenure_details_item_after_downpayment_reduced_product_amount.py +20 -0
  556. pinelabs/types/tenure_details_item_cart_coupon_discount_product_share.py +20 -0
  557. pinelabs/types/tenure_details_item_discount.py +33 -0
  558. pinelabs/types/tenure_details_item_discount_amount.py +20 -0
  559. pinelabs/types/tenure_details_item_discount_breakup.py +22 -0
  560. pinelabs/types/tenure_details_item_discount_breakup_brand.py +20 -0
  561. pinelabs/types/tenure_details_item_discount_breakup_brand_amount.py +20 -0
  562. pinelabs/types/tenure_details_item_discount_breakup_merchant.py +20 -0
  563. pinelabs/types/tenure_details_item_discount_breakup_merchant_amount.py +20 -0
  564. pinelabs/types/tenure_details_item_discount_discount_deferred_duration_type.py +5 -0
  565. pinelabs/types/tenure_details_item_discount_discount_type.py +5 -0
  566. pinelabs/types/tenure_details_item_discount_max_amount.py +20 -0
  567. pinelabs/types/tenure_details_item_downpayment_amount.py +20 -0
  568. pinelabs/types/tenure_details_item_interest_amount.py +20 -0
  569. pinelabs/types/tenure_details_item_product_amount.py +20 -0
  570. pinelabs/types/tenure_details_item_product_coupon_discount_amount.py +20 -0
  571. pinelabs/types/tenure_details_item_product_offer_parameters_item.py +21 -0
  572. pinelabs/types/tenure_details_item_subvention.py +31 -0
  573. pinelabs/types/tenure_details_item_subvention_amount.py +20 -0
  574. pinelabs/types/tenure_details_item_subvention_breakup.py +20 -0
  575. pinelabs/types/tenure_details_item_subvention_breakup_brand.py +20 -0
  576. pinelabs/types/tenure_details_item_subvention_breakup_brand_amount.py +20 -0
  577. pinelabs/types/tenure_details_item_subvention_max_amount.py +20 -0
  578. pinelabs/types/tenure_details_item_subvention_min_amount.py +20 -0
  579. pinelabs/types/tenure_details_item_subvention_offer_type.py +5 -0
  580. pinelabs/types/tenure_details_item_subvention_subvention_type.py +5 -0
  581. pinelabs/types/tenure_discount.py +35 -0
  582. pinelabs/types/tenure_discount_amount.py +20 -0
  583. pinelabs/types/tenure_discount_breakup.py +26 -0
  584. pinelabs/types/tenure_discount_breakup_brand.py +20 -0
  585. pinelabs/types/tenure_discount_breakup_brand_amount.py +20 -0
  586. pinelabs/types/tenure_discount_breakup_dealer.py +20 -0
  587. pinelabs/types/tenure_discount_breakup_dealer_amount.py +20 -0
  588. pinelabs/types/tenure_discount_breakup_issuer.py +20 -0
  589. pinelabs/types/tenure_discount_breakup_issuer_amount.py +20 -0
  590. pinelabs/types/tenure_discount_breakup_merchant.py +20 -0
  591. pinelabs/types/tenure_discount_breakup_merchant_amount.py +20 -0
  592. pinelabs/types/tenure_discount_discount_deferred_duration_type.py +5 -0
  593. pinelabs/types/tenure_discount_discount_type.py +5 -0
  594. pinelabs/types/tenure_discount_max_amount.py +20 -0
  595. pinelabs/types/tenure_downpayment_details.py +24 -0
  596. pinelabs/types/tenure_downpayment_details_downpayment_amount.py +20 -0
  597. pinelabs/types/tenure_emi_type.py +5 -0
  598. pinelabs/types/tenure_interest_amount.py +20 -0
  599. pinelabs/types/tenure_issuer_offer_parameters_item.py +32 -0
  600. pinelabs/types/tenure_loan_amount.py +20 -0
  601. pinelabs/types/tenure_monthly_emi_amount.py +20 -0
  602. pinelabs/types/tenure_net_payment_amount.py +20 -0
  603. pinelabs/types/tenure_processing_fee_amount.py +20 -0
  604. pinelabs/types/tenure_processing_fee_details.py +25 -0
  605. pinelabs/types/tenure_processing_fee_details_amount.py +20 -0
  606. pinelabs/types/tenure_split_emi_amount.py +20 -0
  607. pinelabs/types/tenure_tenure_type.py +5 -0
  608. pinelabs/types/tenure_total_coupon_discount.py +20 -0
  609. pinelabs/types/tenure_total_discount_amount.py +20 -0
  610. pinelabs/types/tenure_total_down_payment_amount.py +20 -0
  611. pinelabs/types/tenure_total_emi_amount.py +20 -0
  612. pinelabs/types/tenure_total_subvention_amount.py +20 -0
  613. pinelabs/types/token_card_data.py +69 -0
  614. pinelabs/types/token_card_data_card_type.py +5 -0
  615. pinelabs/types/token_payment.py +27 -0
  616. pinelabs/types/token_payment_acquirer_data.py +41 -0
  617. pinelabs/types/token_payment_option.py +26 -0
  618. pinelabs/types/token_status.py +5 -0
  619. pinelabs/types/token_transactional_data.py +46 -0
  620. pinelabs/types/upi_details_response.py +30 -0
  621. pinelabs/types/upi_details_response_payer.py +22 -0
  622. pinelabs/types/upi_details_response_txn_mode.py +5 -0
  623. pinelabs_python-0.1.0.dist-info/METADATA +213 -0
  624. pinelabs_python-0.1.0.dist-info/RECORD +626 -0
  625. pinelabs_python-0.1.0.dist-info/WHEEL +4 -0
  626. pinelabs_python-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1643 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import encode_path_param
10
+ from ..core.parse_error import ParsingError
11
+ from ..core.pydantic_utilities import parse_obj_as
12
+ from ..core.request_options import RequestOptions
13
+ from ..core.serialization import convert_and_respect_annotation_metadata
14
+ from ..errors.bad_request_error import BadRequestError
15
+ from ..errors.forbidden_error import ForbiddenError
16
+ from ..errors.internal_server_error import InternalServerError
17
+ from ..errors.not_found_error import NotFoundError
18
+ from ..errors.service_unavailable_error import ServiceUnavailableError
19
+ from ..errors.unauthorized_error import UnauthorizedError
20
+ from ..types.card_token_response import CardTokenResponse
21
+ from ..types.cryptogram_response import CryptogramResponse
22
+ from ..types.customer_token_detail import CustomerTokenDetail
23
+ from ..types.customer_tokens_response import CustomerTokensResponse
24
+ from ..types.delete_customer_token_response import DeleteCustomerTokenResponse
25
+ from ..types.delete_token_by_token_id_response import DeleteTokenByTokenIdResponse
26
+ from ..types.error_response import ErrorResponse
27
+ from ..types.merchant_metadata import MerchantMetadata
28
+ from ..types.token_payment import TokenPayment
29
+ from ..types.token_payment_option import TokenPaymentOption
30
+ from .types.generate_card_token_request_payment_method import GenerateCardTokenRequestPaymentMethod
31
+ from .types.get_service_provider_token_response import GetServiceProviderTokenResponse
32
+ from pydantic import ValidationError
33
+
34
+ # this is used as the default value for optional parameters
35
+ OMIT = typing.cast(typing.Any, ...)
36
+
37
+
38
+ class RawTokenizationClient:
39
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
40
+ self._client_wrapper = client_wrapper
41
+
42
+ def generate_card_token(
43
+ self,
44
+ *,
45
+ customer_id: str,
46
+ merchant_token_reference: str,
47
+ payment_method: GenerateCardTokenRequestPaymentMethod,
48
+ payment_option: typing.Optional[TokenPaymentOption] = OMIT,
49
+ payment: typing.Optional[TokenPayment] = OMIT,
50
+ merchant_metadata: typing.Optional[MerchantMetadata] = OMIT,
51
+ request_options: typing.Optional[RequestOptions] = None,
52
+ ) -> HttpResponse[CardTokenResponse]:
53
+ """
54
+ Generate a network token for a card linked to a customer. This tokenizes the card
55
+ details and returns a token that can be used for subsequent transactions.
56
+
57
+ Parameters
58
+ ----------
59
+ customer_id : str
60
+ Unique identifier of the customer in the Pine Labs Online database.
61
+
62
+ merchant_token_reference : str
63
+ **Idempotency Key.** Unique token reference assigned by the merchant. Duplicate requests with the same `merchant_token_reference` will return the existing token instead of creating a new one.
64
+
65
+ payment_method : GenerateCardTokenRequestPaymentMethod
66
+ Payment method for which the token is being generated. Currently only CARD is supported.
67
+
68
+ payment_option : typing.Optional[TokenPaymentOption]
69
+
70
+ payment : typing.Optional[TokenPayment]
71
+
72
+ merchant_metadata : typing.Optional[MerchantMetadata]
73
+
74
+ request_options : typing.Optional[RequestOptions]
75
+ Request-specific configuration.
76
+
77
+ Returns
78
+ -------
79
+ HttpResponse[CardTokenResponse]
80
+ Card token generated successfully.
81
+ """
82
+ _response = self._client_wrapper.httpx_client.request(
83
+ "api/v1/tokens",
84
+ method="POST",
85
+ json={
86
+ "customer_id": customer_id,
87
+ "merchant_token_reference": merchant_token_reference,
88
+ "payment_method": payment_method,
89
+ "payment_option": convert_and_respect_annotation_metadata(
90
+ object_=payment_option, annotation=TokenPaymentOption, direction="write"
91
+ ),
92
+ "payment": convert_and_respect_annotation_metadata(
93
+ object_=payment, annotation=TokenPayment, direction="write"
94
+ ),
95
+ "merchant_metadata": merchant_metadata,
96
+ },
97
+ headers={
98
+ "content-type": "application/json",
99
+ },
100
+ request_options=request_options,
101
+ omit=OMIT,
102
+ )
103
+ try:
104
+ if 200 <= _response.status_code < 300:
105
+ _data = typing.cast(
106
+ CardTokenResponse,
107
+ parse_obj_as(
108
+ type_=CardTokenResponse, # type: ignore
109
+ object_=_response.json(),
110
+ ),
111
+ )
112
+ return HttpResponse(response=_response, data=_data)
113
+ if _response.status_code == 400:
114
+ raise BadRequestError(
115
+ headers=dict(_response.headers),
116
+ body=typing.cast(
117
+ typing.Any,
118
+ parse_obj_as(
119
+ type_=typing.Any, # type: ignore
120
+ object_=_response.json(),
121
+ ),
122
+ ),
123
+ )
124
+ if _response.status_code == 401:
125
+ raise UnauthorizedError(
126
+ headers=dict(_response.headers),
127
+ body=typing.cast(
128
+ ErrorResponse,
129
+ parse_obj_as(
130
+ type_=ErrorResponse, # type: ignore
131
+ object_=_response.json(),
132
+ ),
133
+ ),
134
+ )
135
+ if _response.status_code == 403:
136
+ raise ForbiddenError(
137
+ headers=dict(_response.headers),
138
+ body=typing.cast(
139
+ ErrorResponse,
140
+ parse_obj_as(
141
+ type_=ErrorResponse, # type: ignore
142
+ object_=_response.json(),
143
+ ),
144
+ ),
145
+ )
146
+ if _response.status_code == 500:
147
+ raise InternalServerError(
148
+ headers=dict(_response.headers),
149
+ body=typing.cast(
150
+ ErrorResponse,
151
+ parse_obj_as(
152
+ type_=ErrorResponse, # type: ignore
153
+ object_=_response.json(),
154
+ ),
155
+ ),
156
+ )
157
+ if _response.status_code == 503:
158
+ raise ServiceUnavailableError(
159
+ headers=dict(_response.headers),
160
+ body=typing.cast(
161
+ ErrorResponse,
162
+ parse_obj_as(
163
+ type_=ErrorResponse, # type: ignore
164
+ object_=_response.json(),
165
+ ),
166
+ ),
167
+ )
168
+ _response_json = _response.json()
169
+ except JSONDecodeError:
170
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
171
+ except ValidationError as e:
172
+ raise ParsingError(
173
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
174
+ )
175
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
176
+
177
+ def get_service_provider_token(
178
+ self, identifier: str, *, request_options: typing.Optional[RequestOptions] = None
179
+ ) -> HttpResponse[GetServiceProviderTokenResponse]:
180
+ """
181
+ Retrieve service provider token information. The `identifier` path parameter
182
+ can be either:
183
+ - A **customer_id** — returns a list of all service provider tokens for that customer.
184
+ - A **token_id** — returns a single service provider token by its unique ID.
185
+
186
+ The response structure varies based on whether a customer_id or token_id is provided.
187
+
188
+ Parameters
189
+ ----------
190
+ identifier : str
191
+ Customer ID or Token ID. When a customer_id is provided, returns all service
192
+ provider tokens for that customer. When a token_id is provided, returns the
193
+ specific token details.
194
+
195
+ request_options : typing.Optional[RequestOptions]
196
+ Request-specific configuration.
197
+
198
+ Returns
199
+ -------
200
+ HttpResponse[GetServiceProviderTokenResponse]
201
+ Service provider token(s) retrieved successfully.
202
+ """
203
+ _response = self._client_wrapper.httpx_client.request(
204
+ f"api/v1/tokens/{encode_path_param(identifier)}",
205
+ method="GET",
206
+ request_options=request_options,
207
+ )
208
+ try:
209
+ if 200 <= _response.status_code < 300:
210
+ _data = typing.cast(
211
+ GetServiceProviderTokenResponse,
212
+ parse_obj_as(
213
+ type_=GetServiceProviderTokenResponse, # type: ignore
214
+ object_=_response.json(),
215
+ ),
216
+ )
217
+ return HttpResponse(response=_response, data=_data)
218
+ if _response.status_code == 400:
219
+ raise BadRequestError(
220
+ headers=dict(_response.headers),
221
+ body=typing.cast(
222
+ typing.Any,
223
+ parse_obj_as(
224
+ type_=typing.Any, # type: ignore
225
+ object_=_response.json(),
226
+ ),
227
+ ),
228
+ )
229
+ if _response.status_code == 401:
230
+ raise UnauthorizedError(
231
+ headers=dict(_response.headers),
232
+ body=typing.cast(
233
+ ErrorResponse,
234
+ parse_obj_as(
235
+ type_=ErrorResponse, # type: ignore
236
+ object_=_response.json(),
237
+ ),
238
+ ),
239
+ )
240
+ if _response.status_code == 403:
241
+ raise ForbiddenError(
242
+ headers=dict(_response.headers),
243
+ body=typing.cast(
244
+ ErrorResponse,
245
+ parse_obj_as(
246
+ type_=ErrorResponse, # type: ignore
247
+ object_=_response.json(),
248
+ ),
249
+ ),
250
+ )
251
+ if _response.status_code == 404:
252
+ raise NotFoundError(
253
+ headers=dict(_response.headers),
254
+ body=typing.cast(
255
+ ErrorResponse,
256
+ parse_obj_as(
257
+ type_=ErrorResponse, # type: ignore
258
+ object_=_response.json(),
259
+ ),
260
+ ),
261
+ )
262
+ if _response.status_code == 500:
263
+ raise InternalServerError(
264
+ headers=dict(_response.headers),
265
+ body=typing.cast(
266
+ ErrorResponse,
267
+ parse_obj_as(
268
+ type_=ErrorResponse, # type: ignore
269
+ object_=_response.json(),
270
+ ),
271
+ ),
272
+ )
273
+ if _response.status_code == 503:
274
+ raise ServiceUnavailableError(
275
+ headers=dict(_response.headers),
276
+ body=typing.cast(
277
+ ErrorResponse,
278
+ parse_obj_as(
279
+ type_=ErrorResponse, # type: ignore
280
+ object_=_response.json(),
281
+ ),
282
+ ),
283
+ )
284
+ _response_json = _response.json()
285
+ except JSONDecodeError:
286
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
287
+ except ValidationError as e:
288
+ raise ParsingError(
289
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
290
+ )
291
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
292
+
293
+ def generate_cryptogram(
294
+ self,
295
+ token_id: str,
296
+ *,
297
+ merchant_unique_reference: str,
298
+ service_provider_token_id: str,
299
+ request_options: typing.Optional[RequestOptions] = None,
300
+ ) -> HttpResponse[CryptogramResponse]:
301
+ """
302
+ Generate a cryptogram for a tokenized card transaction. The cryptogram is used
303
+ for secure network-level token transactions.
304
+
305
+ Parameters
306
+ ----------
307
+ token_id : str
308
+ Unique token ID for which to generate the cryptogram.
309
+
310
+ merchant_unique_reference : str
311
+ Unique reference for this cryptogram generation request.
312
+
313
+ service_provider_token_id : str
314
+ Service provider token identifier.
315
+
316
+ request_options : typing.Optional[RequestOptions]
317
+ Request-specific configuration.
318
+
319
+ Returns
320
+ -------
321
+ HttpResponse[CryptogramResponse]
322
+ Cryptogram generated successfully.
323
+ """
324
+ _response = self._client_wrapper.httpx_client.request(
325
+ f"api/v1/tokens/{encode_path_param(token_id)}/token-transactional-data",
326
+ method="POST",
327
+ json={
328
+ "merchant_unique_reference": merchant_unique_reference,
329
+ "service_provider_token_id": service_provider_token_id,
330
+ },
331
+ headers={
332
+ "content-type": "application/json",
333
+ },
334
+ request_options=request_options,
335
+ omit=OMIT,
336
+ )
337
+ try:
338
+ if 200 <= _response.status_code < 300:
339
+ _data = typing.cast(
340
+ CryptogramResponse,
341
+ parse_obj_as(
342
+ type_=CryptogramResponse, # type: ignore
343
+ object_=_response.json(),
344
+ ),
345
+ )
346
+ return HttpResponse(response=_response, data=_data)
347
+ if _response.status_code == 400:
348
+ raise BadRequestError(
349
+ headers=dict(_response.headers),
350
+ body=typing.cast(
351
+ typing.Any,
352
+ parse_obj_as(
353
+ type_=typing.Any, # type: ignore
354
+ object_=_response.json(),
355
+ ),
356
+ ),
357
+ )
358
+ if _response.status_code == 401:
359
+ raise UnauthorizedError(
360
+ headers=dict(_response.headers),
361
+ body=typing.cast(
362
+ ErrorResponse,
363
+ parse_obj_as(
364
+ type_=ErrorResponse, # type: ignore
365
+ object_=_response.json(),
366
+ ),
367
+ ),
368
+ )
369
+ if _response.status_code == 403:
370
+ raise ForbiddenError(
371
+ headers=dict(_response.headers),
372
+ body=typing.cast(
373
+ ErrorResponse,
374
+ parse_obj_as(
375
+ type_=ErrorResponse, # type: ignore
376
+ object_=_response.json(),
377
+ ),
378
+ ),
379
+ )
380
+ if _response.status_code == 500:
381
+ raise InternalServerError(
382
+ headers=dict(_response.headers),
383
+ body=typing.cast(
384
+ ErrorResponse,
385
+ parse_obj_as(
386
+ type_=ErrorResponse, # type: ignore
387
+ object_=_response.json(),
388
+ ),
389
+ ),
390
+ )
391
+ if _response.status_code == 503:
392
+ raise ServiceUnavailableError(
393
+ headers=dict(_response.headers),
394
+ body=typing.cast(
395
+ ErrorResponse,
396
+ parse_obj_as(
397
+ type_=ErrorResponse, # type: ignore
398
+ object_=_response.json(),
399
+ ),
400
+ ),
401
+ )
402
+ _response_json = _response.json()
403
+ except JSONDecodeError:
404
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
405
+ except ValidationError as e:
406
+ raise ParsingError(
407
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
408
+ )
409
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
410
+
411
+ def delete_token_by_token_id(
412
+ self, token_id: str, *, request_options: typing.Optional[RequestOptions] = None
413
+ ) -> HttpResponse[DeleteTokenByTokenIdResponse]:
414
+ """
415
+ Delete a service provider token by its token ID. This permanently deactivates
416
+ the token.
417
+
418
+ Parameters
419
+ ----------
420
+ token_id : str
421
+ Unique token ID to delete.
422
+
423
+ request_options : typing.Optional[RequestOptions]
424
+ Request-specific configuration.
425
+
426
+ Returns
427
+ -------
428
+ HttpResponse[DeleteTokenByTokenIdResponse]
429
+ Token deleted successfully.
430
+ """
431
+ _response = self._client_wrapper.httpx_client.request(
432
+ f"api/v1/tokens/{encode_path_param(token_id)}/delete",
433
+ method="POST",
434
+ request_options=request_options,
435
+ )
436
+ try:
437
+ if 200 <= _response.status_code < 300:
438
+ _data = typing.cast(
439
+ DeleteTokenByTokenIdResponse,
440
+ parse_obj_as(
441
+ type_=DeleteTokenByTokenIdResponse, # type: ignore
442
+ object_=_response.json(),
443
+ ),
444
+ )
445
+ return HttpResponse(response=_response, data=_data)
446
+ if _response.status_code == 400:
447
+ raise BadRequestError(
448
+ headers=dict(_response.headers),
449
+ body=typing.cast(
450
+ typing.Any,
451
+ parse_obj_as(
452
+ type_=typing.Any, # type: ignore
453
+ object_=_response.json(),
454
+ ),
455
+ ),
456
+ )
457
+ if _response.status_code == 401:
458
+ raise UnauthorizedError(
459
+ headers=dict(_response.headers),
460
+ body=typing.cast(
461
+ ErrorResponse,
462
+ parse_obj_as(
463
+ type_=ErrorResponse, # type: ignore
464
+ object_=_response.json(),
465
+ ),
466
+ ),
467
+ )
468
+ if _response.status_code == 403:
469
+ raise ForbiddenError(
470
+ headers=dict(_response.headers),
471
+ body=typing.cast(
472
+ ErrorResponse,
473
+ parse_obj_as(
474
+ type_=ErrorResponse, # type: ignore
475
+ object_=_response.json(),
476
+ ),
477
+ ),
478
+ )
479
+ if _response.status_code == 404:
480
+ raise NotFoundError(
481
+ headers=dict(_response.headers),
482
+ body=typing.cast(
483
+ ErrorResponse,
484
+ parse_obj_as(
485
+ type_=ErrorResponse, # type: ignore
486
+ object_=_response.json(),
487
+ ),
488
+ ),
489
+ )
490
+ if _response.status_code == 500:
491
+ raise InternalServerError(
492
+ headers=dict(_response.headers),
493
+ body=typing.cast(
494
+ ErrorResponse,
495
+ parse_obj_as(
496
+ type_=ErrorResponse, # type: ignore
497
+ object_=_response.json(),
498
+ ),
499
+ ),
500
+ )
501
+ if _response.status_code == 503:
502
+ raise ServiceUnavailableError(
503
+ headers=dict(_response.headers),
504
+ body=typing.cast(
505
+ ErrorResponse,
506
+ parse_obj_as(
507
+ type_=ErrorResponse, # type: ignore
508
+ object_=_response.json(),
509
+ ),
510
+ ),
511
+ )
512
+ _response_json = _response.json()
513
+ except JSONDecodeError:
514
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
515
+ except ValidationError as e:
516
+ raise ParsingError(
517
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
518
+ )
519
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
520
+
521
+ def get_customer_tokens_by_customer_id(
522
+ self, customer_id: str, *, request_options: typing.Optional[RequestOptions] = None
523
+ ) -> HttpResponse[CustomerTokensResponse]:
524
+ """
525
+ Retrieve all tokens linked to a customer by the customer's unique ID.
526
+
527
+ Parameters
528
+ ----------
529
+ customer_id : str
530
+ Unique identifier of the customer in the Pine Labs Online database.
531
+
532
+ request_options : typing.Optional[RequestOptions]
533
+ Request-specific configuration.
534
+
535
+ Returns
536
+ -------
537
+ HttpResponse[CustomerTokensResponse]
538
+ Customer tokens retrieved successfully.
539
+ """
540
+ _response = self._client_wrapper.httpx_client.request(
541
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens",
542
+ method="GET",
543
+ request_options=request_options,
544
+ )
545
+ try:
546
+ if 200 <= _response.status_code < 300:
547
+ _data = typing.cast(
548
+ CustomerTokensResponse,
549
+ parse_obj_as(
550
+ type_=CustomerTokensResponse, # type: ignore
551
+ object_=_response.json(),
552
+ ),
553
+ )
554
+ return HttpResponse(response=_response, data=_data)
555
+ if _response.status_code == 400:
556
+ raise BadRequestError(
557
+ headers=dict(_response.headers),
558
+ body=typing.cast(
559
+ typing.Any,
560
+ parse_obj_as(
561
+ type_=typing.Any, # type: ignore
562
+ object_=_response.json(),
563
+ ),
564
+ ),
565
+ )
566
+ if _response.status_code == 401:
567
+ raise UnauthorizedError(
568
+ headers=dict(_response.headers),
569
+ body=typing.cast(
570
+ ErrorResponse,
571
+ parse_obj_as(
572
+ type_=ErrorResponse, # type: ignore
573
+ object_=_response.json(),
574
+ ),
575
+ ),
576
+ )
577
+ if _response.status_code == 403:
578
+ raise ForbiddenError(
579
+ headers=dict(_response.headers),
580
+ body=typing.cast(
581
+ ErrorResponse,
582
+ parse_obj_as(
583
+ type_=ErrorResponse, # type: ignore
584
+ object_=_response.json(),
585
+ ),
586
+ ),
587
+ )
588
+ if _response.status_code == 404:
589
+ raise NotFoundError(
590
+ headers=dict(_response.headers),
591
+ body=typing.cast(
592
+ ErrorResponse,
593
+ parse_obj_as(
594
+ type_=ErrorResponse, # type: ignore
595
+ object_=_response.json(),
596
+ ),
597
+ ),
598
+ )
599
+ if _response.status_code == 500:
600
+ raise InternalServerError(
601
+ headers=dict(_response.headers),
602
+ body=typing.cast(
603
+ ErrorResponse,
604
+ parse_obj_as(
605
+ type_=ErrorResponse, # type: ignore
606
+ object_=_response.json(),
607
+ ),
608
+ ),
609
+ )
610
+ _response_json = _response.json()
611
+ except JSONDecodeError:
612
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
613
+ except ValidationError as e:
614
+ raise ParsingError(
615
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
616
+ )
617
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
618
+
619
+ def get_customer_token_by_token_id(
620
+ self, customer_id: str, token_id: str, *, request_options: typing.Optional[RequestOptions] = None
621
+ ) -> HttpResponse[CustomerTokenDetail]:
622
+ """
623
+ Retrieve a specific token linked to a customer by both the customer ID and token ID.
624
+
625
+ Parameters
626
+ ----------
627
+ customer_id : str
628
+ Unique identifier of the customer in the Pine Labs Online database.
629
+
630
+ token_id : str
631
+ Unique token ID to retrieve.
632
+
633
+ request_options : typing.Optional[RequestOptions]
634
+ Request-specific configuration.
635
+
636
+ Returns
637
+ -------
638
+ HttpResponse[CustomerTokenDetail]
639
+ Customer token details retrieved successfully.
640
+ """
641
+ _response = self._client_wrapper.httpx_client.request(
642
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens/{encode_path_param(token_id)}",
643
+ method="GET",
644
+ request_options=request_options,
645
+ )
646
+ try:
647
+ if 200 <= _response.status_code < 300:
648
+ _data = typing.cast(
649
+ CustomerTokenDetail,
650
+ parse_obj_as(
651
+ type_=CustomerTokenDetail, # type: ignore
652
+ object_=_response.json(),
653
+ ),
654
+ )
655
+ return HttpResponse(response=_response, data=_data)
656
+ if _response.status_code == 400:
657
+ raise BadRequestError(
658
+ headers=dict(_response.headers),
659
+ body=typing.cast(
660
+ typing.Any,
661
+ parse_obj_as(
662
+ type_=typing.Any, # type: ignore
663
+ object_=_response.json(),
664
+ ),
665
+ ),
666
+ )
667
+ if _response.status_code == 401:
668
+ raise UnauthorizedError(
669
+ headers=dict(_response.headers),
670
+ body=typing.cast(
671
+ ErrorResponse,
672
+ parse_obj_as(
673
+ type_=ErrorResponse, # type: ignore
674
+ object_=_response.json(),
675
+ ),
676
+ ),
677
+ )
678
+ if _response.status_code == 403:
679
+ raise ForbiddenError(
680
+ headers=dict(_response.headers),
681
+ body=typing.cast(
682
+ ErrorResponse,
683
+ parse_obj_as(
684
+ type_=ErrorResponse, # type: ignore
685
+ object_=_response.json(),
686
+ ),
687
+ ),
688
+ )
689
+ if _response.status_code == 404:
690
+ raise NotFoundError(
691
+ headers=dict(_response.headers),
692
+ body=typing.cast(
693
+ ErrorResponse,
694
+ parse_obj_as(
695
+ type_=ErrorResponse, # type: ignore
696
+ object_=_response.json(),
697
+ ),
698
+ ),
699
+ )
700
+ if _response.status_code == 500:
701
+ raise InternalServerError(
702
+ headers=dict(_response.headers),
703
+ body=typing.cast(
704
+ ErrorResponse,
705
+ parse_obj_as(
706
+ type_=ErrorResponse, # type: ignore
707
+ object_=_response.json(),
708
+ ),
709
+ ),
710
+ )
711
+ _response_json = _response.json()
712
+ except JSONDecodeError:
713
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
714
+ except ValidationError as e:
715
+ raise ParsingError(
716
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
717
+ )
718
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
719
+
720
+ def delete_customer_token(
721
+ self,
722
+ customer_id: str,
723
+ token_id: str,
724
+ *,
725
+ merchant_unique_reference: str,
726
+ merchant_metadata: typing.Optional[MerchantMetadata] = OMIT,
727
+ request_options: typing.Optional[RequestOptions] = None,
728
+ ) -> HttpResponse[DeleteCustomerTokenResponse]:
729
+ """
730
+ Delete a specific token linked to a customer by both the customer ID and token ID.
731
+ Requires a unique merchant reference for the delete operation.
732
+
733
+ Parameters
734
+ ----------
735
+ customer_id : str
736
+ Unique identifier of the customer in the Pine Labs Online database.
737
+
738
+ token_id : str
739
+ Unique token ID to delete.
740
+
741
+ merchant_unique_reference : str
742
+ Unique reference for this delete operation.
743
+
744
+ merchant_metadata : typing.Optional[MerchantMetadata]
745
+
746
+ request_options : typing.Optional[RequestOptions]
747
+ Request-specific configuration.
748
+
749
+ Returns
750
+ -------
751
+ HttpResponse[DeleteCustomerTokenResponse]
752
+ Customer token deleted successfully.
753
+ """
754
+ _response = self._client_wrapper.httpx_client.request(
755
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens/{encode_path_param(token_id)}/delete",
756
+ method="POST",
757
+ json={
758
+ "merchant_unique_reference": merchant_unique_reference,
759
+ "merchant_metadata": merchant_metadata,
760
+ },
761
+ headers={
762
+ "content-type": "application/json",
763
+ },
764
+ request_options=request_options,
765
+ omit=OMIT,
766
+ )
767
+ try:
768
+ if 200 <= _response.status_code < 300:
769
+ _data = typing.cast(
770
+ DeleteCustomerTokenResponse,
771
+ parse_obj_as(
772
+ type_=DeleteCustomerTokenResponse, # type: ignore
773
+ object_=_response.json(),
774
+ ),
775
+ )
776
+ return HttpResponse(response=_response, data=_data)
777
+ if _response.status_code == 400:
778
+ raise BadRequestError(
779
+ headers=dict(_response.headers),
780
+ body=typing.cast(
781
+ typing.Any,
782
+ parse_obj_as(
783
+ type_=typing.Any, # type: ignore
784
+ object_=_response.json(),
785
+ ),
786
+ ),
787
+ )
788
+ if _response.status_code == 401:
789
+ raise UnauthorizedError(
790
+ headers=dict(_response.headers),
791
+ body=typing.cast(
792
+ ErrorResponse,
793
+ parse_obj_as(
794
+ type_=ErrorResponse, # type: ignore
795
+ object_=_response.json(),
796
+ ),
797
+ ),
798
+ )
799
+ if _response.status_code == 403:
800
+ raise ForbiddenError(
801
+ headers=dict(_response.headers),
802
+ body=typing.cast(
803
+ ErrorResponse,
804
+ parse_obj_as(
805
+ type_=ErrorResponse, # type: ignore
806
+ object_=_response.json(),
807
+ ),
808
+ ),
809
+ )
810
+ if _response.status_code == 404:
811
+ raise NotFoundError(
812
+ headers=dict(_response.headers),
813
+ body=typing.cast(
814
+ ErrorResponse,
815
+ parse_obj_as(
816
+ type_=ErrorResponse, # type: ignore
817
+ object_=_response.json(),
818
+ ),
819
+ ),
820
+ )
821
+ if _response.status_code == 500:
822
+ raise InternalServerError(
823
+ headers=dict(_response.headers),
824
+ body=typing.cast(
825
+ ErrorResponse,
826
+ parse_obj_as(
827
+ type_=ErrorResponse, # type: ignore
828
+ object_=_response.json(),
829
+ ),
830
+ ),
831
+ )
832
+ _response_json = _response.json()
833
+ except JSONDecodeError:
834
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
835
+ except ValidationError as e:
836
+ raise ParsingError(
837
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
838
+ )
839
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
840
+
841
+
842
+ class AsyncRawTokenizationClient:
843
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
844
+ self._client_wrapper = client_wrapper
845
+
846
+ async def generate_card_token(
847
+ self,
848
+ *,
849
+ customer_id: str,
850
+ merchant_token_reference: str,
851
+ payment_method: GenerateCardTokenRequestPaymentMethod,
852
+ payment_option: typing.Optional[TokenPaymentOption] = OMIT,
853
+ payment: typing.Optional[TokenPayment] = OMIT,
854
+ merchant_metadata: typing.Optional[MerchantMetadata] = OMIT,
855
+ request_options: typing.Optional[RequestOptions] = None,
856
+ ) -> AsyncHttpResponse[CardTokenResponse]:
857
+ """
858
+ Generate a network token for a card linked to a customer. This tokenizes the card
859
+ details and returns a token that can be used for subsequent transactions.
860
+
861
+ Parameters
862
+ ----------
863
+ customer_id : str
864
+ Unique identifier of the customer in the Pine Labs Online database.
865
+
866
+ merchant_token_reference : str
867
+ **Idempotency Key.** Unique token reference assigned by the merchant. Duplicate requests with the same `merchant_token_reference` will return the existing token instead of creating a new one.
868
+
869
+ payment_method : GenerateCardTokenRequestPaymentMethod
870
+ Payment method for which the token is being generated. Currently only CARD is supported.
871
+
872
+ payment_option : typing.Optional[TokenPaymentOption]
873
+
874
+ payment : typing.Optional[TokenPayment]
875
+
876
+ merchant_metadata : typing.Optional[MerchantMetadata]
877
+
878
+ request_options : typing.Optional[RequestOptions]
879
+ Request-specific configuration.
880
+
881
+ Returns
882
+ -------
883
+ AsyncHttpResponse[CardTokenResponse]
884
+ Card token generated successfully.
885
+ """
886
+ _response = await self._client_wrapper.httpx_client.request(
887
+ "api/v1/tokens",
888
+ method="POST",
889
+ json={
890
+ "customer_id": customer_id,
891
+ "merchant_token_reference": merchant_token_reference,
892
+ "payment_method": payment_method,
893
+ "payment_option": convert_and_respect_annotation_metadata(
894
+ object_=payment_option, annotation=TokenPaymentOption, direction="write"
895
+ ),
896
+ "payment": convert_and_respect_annotation_metadata(
897
+ object_=payment, annotation=TokenPayment, direction="write"
898
+ ),
899
+ "merchant_metadata": merchant_metadata,
900
+ },
901
+ headers={
902
+ "content-type": "application/json",
903
+ },
904
+ request_options=request_options,
905
+ omit=OMIT,
906
+ )
907
+ try:
908
+ if 200 <= _response.status_code < 300:
909
+ _data = typing.cast(
910
+ CardTokenResponse,
911
+ parse_obj_as(
912
+ type_=CardTokenResponse, # type: ignore
913
+ object_=_response.json(),
914
+ ),
915
+ )
916
+ return AsyncHttpResponse(response=_response, data=_data)
917
+ if _response.status_code == 400:
918
+ raise BadRequestError(
919
+ headers=dict(_response.headers),
920
+ body=typing.cast(
921
+ typing.Any,
922
+ parse_obj_as(
923
+ type_=typing.Any, # type: ignore
924
+ object_=_response.json(),
925
+ ),
926
+ ),
927
+ )
928
+ if _response.status_code == 401:
929
+ raise UnauthorizedError(
930
+ headers=dict(_response.headers),
931
+ body=typing.cast(
932
+ ErrorResponse,
933
+ parse_obj_as(
934
+ type_=ErrorResponse, # type: ignore
935
+ object_=_response.json(),
936
+ ),
937
+ ),
938
+ )
939
+ if _response.status_code == 403:
940
+ raise ForbiddenError(
941
+ headers=dict(_response.headers),
942
+ body=typing.cast(
943
+ ErrorResponse,
944
+ parse_obj_as(
945
+ type_=ErrorResponse, # type: ignore
946
+ object_=_response.json(),
947
+ ),
948
+ ),
949
+ )
950
+ if _response.status_code == 500:
951
+ raise InternalServerError(
952
+ headers=dict(_response.headers),
953
+ body=typing.cast(
954
+ ErrorResponse,
955
+ parse_obj_as(
956
+ type_=ErrorResponse, # type: ignore
957
+ object_=_response.json(),
958
+ ),
959
+ ),
960
+ )
961
+ if _response.status_code == 503:
962
+ raise ServiceUnavailableError(
963
+ headers=dict(_response.headers),
964
+ body=typing.cast(
965
+ ErrorResponse,
966
+ parse_obj_as(
967
+ type_=ErrorResponse, # type: ignore
968
+ object_=_response.json(),
969
+ ),
970
+ ),
971
+ )
972
+ _response_json = _response.json()
973
+ except JSONDecodeError:
974
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
975
+ except ValidationError as e:
976
+ raise ParsingError(
977
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
978
+ )
979
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
980
+
981
+ async def get_service_provider_token(
982
+ self, identifier: str, *, request_options: typing.Optional[RequestOptions] = None
983
+ ) -> AsyncHttpResponse[GetServiceProviderTokenResponse]:
984
+ """
985
+ Retrieve service provider token information. The `identifier` path parameter
986
+ can be either:
987
+ - A **customer_id** — returns a list of all service provider tokens for that customer.
988
+ - A **token_id** — returns a single service provider token by its unique ID.
989
+
990
+ The response structure varies based on whether a customer_id or token_id is provided.
991
+
992
+ Parameters
993
+ ----------
994
+ identifier : str
995
+ Customer ID or Token ID. When a customer_id is provided, returns all service
996
+ provider tokens for that customer. When a token_id is provided, returns the
997
+ specific token details.
998
+
999
+ request_options : typing.Optional[RequestOptions]
1000
+ Request-specific configuration.
1001
+
1002
+ Returns
1003
+ -------
1004
+ AsyncHttpResponse[GetServiceProviderTokenResponse]
1005
+ Service provider token(s) retrieved successfully.
1006
+ """
1007
+ _response = await self._client_wrapper.httpx_client.request(
1008
+ f"api/v1/tokens/{encode_path_param(identifier)}",
1009
+ method="GET",
1010
+ request_options=request_options,
1011
+ )
1012
+ try:
1013
+ if 200 <= _response.status_code < 300:
1014
+ _data = typing.cast(
1015
+ GetServiceProviderTokenResponse,
1016
+ parse_obj_as(
1017
+ type_=GetServiceProviderTokenResponse, # type: ignore
1018
+ object_=_response.json(),
1019
+ ),
1020
+ )
1021
+ return AsyncHttpResponse(response=_response, data=_data)
1022
+ if _response.status_code == 400:
1023
+ raise BadRequestError(
1024
+ headers=dict(_response.headers),
1025
+ body=typing.cast(
1026
+ typing.Any,
1027
+ parse_obj_as(
1028
+ type_=typing.Any, # type: ignore
1029
+ object_=_response.json(),
1030
+ ),
1031
+ ),
1032
+ )
1033
+ if _response.status_code == 401:
1034
+ raise UnauthorizedError(
1035
+ headers=dict(_response.headers),
1036
+ body=typing.cast(
1037
+ ErrorResponse,
1038
+ parse_obj_as(
1039
+ type_=ErrorResponse, # type: ignore
1040
+ object_=_response.json(),
1041
+ ),
1042
+ ),
1043
+ )
1044
+ if _response.status_code == 403:
1045
+ raise ForbiddenError(
1046
+ headers=dict(_response.headers),
1047
+ body=typing.cast(
1048
+ ErrorResponse,
1049
+ parse_obj_as(
1050
+ type_=ErrorResponse, # type: ignore
1051
+ object_=_response.json(),
1052
+ ),
1053
+ ),
1054
+ )
1055
+ if _response.status_code == 404:
1056
+ raise NotFoundError(
1057
+ headers=dict(_response.headers),
1058
+ body=typing.cast(
1059
+ ErrorResponse,
1060
+ parse_obj_as(
1061
+ type_=ErrorResponse, # type: ignore
1062
+ object_=_response.json(),
1063
+ ),
1064
+ ),
1065
+ )
1066
+ if _response.status_code == 500:
1067
+ raise InternalServerError(
1068
+ headers=dict(_response.headers),
1069
+ body=typing.cast(
1070
+ ErrorResponse,
1071
+ parse_obj_as(
1072
+ type_=ErrorResponse, # type: ignore
1073
+ object_=_response.json(),
1074
+ ),
1075
+ ),
1076
+ )
1077
+ if _response.status_code == 503:
1078
+ raise ServiceUnavailableError(
1079
+ headers=dict(_response.headers),
1080
+ body=typing.cast(
1081
+ ErrorResponse,
1082
+ parse_obj_as(
1083
+ type_=ErrorResponse, # type: ignore
1084
+ object_=_response.json(),
1085
+ ),
1086
+ ),
1087
+ )
1088
+ _response_json = _response.json()
1089
+ except JSONDecodeError:
1090
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1091
+ except ValidationError as e:
1092
+ raise ParsingError(
1093
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1094
+ )
1095
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1096
+
1097
+ async def generate_cryptogram(
1098
+ self,
1099
+ token_id: str,
1100
+ *,
1101
+ merchant_unique_reference: str,
1102
+ service_provider_token_id: str,
1103
+ request_options: typing.Optional[RequestOptions] = None,
1104
+ ) -> AsyncHttpResponse[CryptogramResponse]:
1105
+ """
1106
+ Generate a cryptogram for a tokenized card transaction. The cryptogram is used
1107
+ for secure network-level token transactions.
1108
+
1109
+ Parameters
1110
+ ----------
1111
+ token_id : str
1112
+ Unique token ID for which to generate the cryptogram.
1113
+
1114
+ merchant_unique_reference : str
1115
+ Unique reference for this cryptogram generation request.
1116
+
1117
+ service_provider_token_id : str
1118
+ Service provider token identifier.
1119
+
1120
+ request_options : typing.Optional[RequestOptions]
1121
+ Request-specific configuration.
1122
+
1123
+ Returns
1124
+ -------
1125
+ AsyncHttpResponse[CryptogramResponse]
1126
+ Cryptogram generated successfully.
1127
+ """
1128
+ _response = await self._client_wrapper.httpx_client.request(
1129
+ f"api/v1/tokens/{encode_path_param(token_id)}/token-transactional-data",
1130
+ method="POST",
1131
+ json={
1132
+ "merchant_unique_reference": merchant_unique_reference,
1133
+ "service_provider_token_id": service_provider_token_id,
1134
+ },
1135
+ headers={
1136
+ "content-type": "application/json",
1137
+ },
1138
+ request_options=request_options,
1139
+ omit=OMIT,
1140
+ )
1141
+ try:
1142
+ if 200 <= _response.status_code < 300:
1143
+ _data = typing.cast(
1144
+ CryptogramResponse,
1145
+ parse_obj_as(
1146
+ type_=CryptogramResponse, # type: ignore
1147
+ object_=_response.json(),
1148
+ ),
1149
+ )
1150
+ return AsyncHttpResponse(response=_response, data=_data)
1151
+ if _response.status_code == 400:
1152
+ raise BadRequestError(
1153
+ headers=dict(_response.headers),
1154
+ body=typing.cast(
1155
+ typing.Any,
1156
+ parse_obj_as(
1157
+ type_=typing.Any, # type: ignore
1158
+ object_=_response.json(),
1159
+ ),
1160
+ ),
1161
+ )
1162
+ if _response.status_code == 401:
1163
+ raise UnauthorizedError(
1164
+ headers=dict(_response.headers),
1165
+ body=typing.cast(
1166
+ ErrorResponse,
1167
+ parse_obj_as(
1168
+ type_=ErrorResponse, # type: ignore
1169
+ object_=_response.json(),
1170
+ ),
1171
+ ),
1172
+ )
1173
+ if _response.status_code == 403:
1174
+ raise ForbiddenError(
1175
+ headers=dict(_response.headers),
1176
+ body=typing.cast(
1177
+ ErrorResponse,
1178
+ parse_obj_as(
1179
+ type_=ErrorResponse, # type: ignore
1180
+ object_=_response.json(),
1181
+ ),
1182
+ ),
1183
+ )
1184
+ if _response.status_code == 500:
1185
+ raise InternalServerError(
1186
+ headers=dict(_response.headers),
1187
+ body=typing.cast(
1188
+ ErrorResponse,
1189
+ parse_obj_as(
1190
+ type_=ErrorResponse, # type: ignore
1191
+ object_=_response.json(),
1192
+ ),
1193
+ ),
1194
+ )
1195
+ if _response.status_code == 503:
1196
+ raise ServiceUnavailableError(
1197
+ headers=dict(_response.headers),
1198
+ body=typing.cast(
1199
+ ErrorResponse,
1200
+ parse_obj_as(
1201
+ type_=ErrorResponse, # type: ignore
1202
+ object_=_response.json(),
1203
+ ),
1204
+ ),
1205
+ )
1206
+ _response_json = _response.json()
1207
+ except JSONDecodeError:
1208
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1209
+ except ValidationError as e:
1210
+ raise ParsingError(
1211
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1212
+ )
1213
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1214
+
1215
+ async def delete_token_by_token_id(
1216
+ self, token_id: str, *, request_options: typing.Optional[RequestOptions] = None
1217
+ ) -> AsyncHttpResponse[DeleteTokenByTokenIdResponse]:
1218
+ """
1219
+ Delete a service provider token by its token ID. This permanently deactivates
1220
+ the token.
1221
+
1222
+ Parameters
1223
+ ----------
1224
+ token_id : str
1225
+ Unique token ID to delete.
1226
+
1227
+ request_options : typing.Optional[RequestOptions]
1228
+ Request-specific configuration.
1229
+
1230
+ Returns
1231
+ -------
1232
+ AsyncHttpResponse[DeleteTokenByTokenIdResponse]
1233
+ Token deleted successfully.
1234
+ """
1235
+ _response = await self._client_wrapper.httpx_client.request(
1236
+ f"api/v1/tokens/{encode_path_param(token_id)}/delete",
1237
+ method="POST",
1238
+ request_options=request_options,
1239
+ )
1240
+ try:
1241
+ if 200 <= _response.status_code < 300:
1242
+ _data = typing.cast(
1243
+ DeleteTokenByTokenIdResponse,
1244
+ parse_obj_as(
1245
+ type_=DeleteTokenByTokenIdResponse, # type: ignore
1246
+ object_=_response.json(),
1247
+ ),
1248
+ )
1249
+ return AsyncHttpResponse(response=_response, data=_data)
1250
+ if _response.status_code == 400:
1251
+ raise BadRequestError(
1252
+ headers=dict(_response.headers),
1253
+ body=typing.cast(
1254
+ typing.Any,
1255
+ parse_obj_as(
1256
+ type_=typing.Any, # type: ignore
1257
+ object_=_response.json(),
1258
+ ),
1259
+ ),
1260
+ )
1261
+ if _response.status_code == 401:
1262
+ raise UnauthorizedError(
1263
+ headers=dict(_response.headers),
1264
+ body=typing.cast(
1265
+ ErrorResponse,
1266
+ parse_obj_as(
1267
+ type_=ErrorResponse, # type: ignore
1268
+ object_=_response.json(),
1269
+ ),
1270
+ ),
1271
+ )
1272
+ if _response.status_code == 403:
1273
+ raise ForbiddenError(
1274
+ headers=dict(_response.headers),
1275
+ body=typing.cast(
1276
+ ErrorResponse,
1277
+ parse_obj_as(
1278
+ type_=ErrorResponse, # type: ignore
1279
+ object_=_response.json(),
1280
+ ),
1281
+ ),
1282
+ )
1283
+ if _response.status_code == 404:
1284
+ raise NotFoundError(
1285
+ headers=dict(_response.headers),
1286
+ body=typing.cast(
1287
+ ErrorResponse,
1288
+ parse_obj_as(
1289
+ type_=ErrorResponse, # type: ignore
1290
+ object_=_response.json(),
1291
+ ),
1292
+ ),
1293
+ )
1294
+ if _response.status_code == 500:
1295
+ raise InternalServerError(
1296
+ headers=dict(_response.headers),
1297
+ body=typing.cast(
1298
+ ErrorResponse,
1299
+ parse_obj_as(
1300
+ type_=ErrorResponse, # type: ignore
1301
+ object_=_response.json(),
1302
+ ),
1303
+ ),
1304
+ )
1305
+ if _response.status_code == 503:
1306
+ raise ServiceUnavailableError(
1307
+ headers=dict(_response.headers),
1308
+ body=typing.cast(
1309
+ ErrorResponse,
1310
+ parse_obj_as(
1311
+ type_=ErrorResponse, # type: ignore
1312
+ object_=_response.json(),
1313
+ ),
1314
+ ),
1315
+ )
1316
+ _response_json = _response.json()
1317
+ except JSONDecodeError:
1318
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1319
+ except ValidationError as e:
1320
+ raise ParsingError(
1321
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1322
+ )
1323
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1324
+
1325
+ async def get_customer_tokens_by_customer_id(
1326
+ self, customer_id: str, *, request_options: typing.Optional[RequestOptions] = None
1327
+ ) -> AsyncHttpResponse[CustomerTokensResponse]:
1328
+ """
1329
+ Retrieve all tokens linked to a customer by the customer's unique ID.
1330
+
1331
+ Parameters
1332
+ ----------
1333
+ customer_id : str
1334
+ Unique identifier of the customer in the Pine Labs Online database.
1335
+
1336
+ request_options : typing.Optional[RequestOptions]
1337
+ Request-specific configuration.
1338
+
1339
+ Returns
1340
+ -------
1341
+ AsyncHttpResponse[CustomerTokensResponse]
1342
+ Customer tokens retrieved successfully.
1343
+ """
1344
+ _response = await self._client_wrapper.httpx_client.request(
1345
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens",
1346
+ method="GET",
1347
+ request_options=request_options,
1348
+ )
1349
+ try:
1350
+ if 200 <= _response.status_code < 300:
1351
+ _data = typing.cast(
1352
+ CustomerTokensResponse,
1353
+ parse_obj_as(
1354
+ type_=CustomerTokensResponse, # type: ignore
1355
+ object_=_response.json(),
1356
+ ),
1357
+ )
1358
+ return AsyncHttpResponse(response=_response, data=_data)
1359
+ if _response.status_code == 400:
1360
+ raise BadRequestError(
1361
+ headers=dict(_response.headers),
1362
+ body=typing.cast(
1363
+ typing.Any,
1364
+ parse_obj_as(
1365
+ type_=typing.Any, # type: ignore
1366
+ object_=_response.json(),
1367
+ ),
1368
+ ),
1369
+ )
1370
+ if _response.status_code == 401:
1371
+ raise UnauthorizedError(
1372
+ headers=dict(_response.headers),
1373
+ body=typing.cast(
1374
+ ErrorResponse,
1375
+ parse_obj_as(
1376
+ type_=ErrorResponse, # type: ignore
1377
+ object_=_response.json(),
1378
+ ),
1379
+ ),
1380
+ )
1381
+ if _response.status_code == 403:
1382
+ raise ForbiddenError(
1383
+ headers=dict(_response.headers),
1384
+ body=typing.cast(
1385
+ ErrorResponse,
1386
+ parse_obj_as(
1387
+ type_=ErrorResponse, # type: ignore
1388
+ object_=_response.json(),
1389
+ ),
1390
+ ),
1391
+ )
1392
+ if _response.status_code == 404:
1393
+ raise NotFoundError(
1394
+ headers=dict(_response.headers),
1395
+ body=typing.cast(
1396
+ ErrorResponse,
1397
+ parse_obj_as(
1398
+ type_=ErrorResponse, # type: ignore
1399
+ object_=_response.json(),
1400
+ ),
1401
+ ),
1402
+ )
1403
+ if _response.status_code == 500:
1404
+ raise InternalServerError(
1405
+ headers=dict(_response.headers),
1406
+ body=typing.cast(
1407
+ ErrorResponse,
1408
+ parse_obj_as(
1409
+ type_=ErrorResponse, # type: ignore
1410
+ object_=_response.json(),
1411
+ ),
1412
+ ),
1413
+ )
1414
+ _response_json = _response.json()
1415
+ except JSONDecodeError:
1416
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1417
+ except ValidationError as e:
1418
+ raise ParsingError(
1419
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1420
+ )
1421
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1422
+
1423
+ async def get_customer_token_by_token_id(
1424
+ self, customer_id: str, token_id: str, *, request_options: typing.Optional[RequestOptions] = None
1425
+ ) -> AsyncHttpResponse[CustomerTokenDetail]:
1426
+ """
1427
+ Retrieve a specific token linked to a customer by both the customer ID and token ID.
1428
+
1429
+ Parameters
1430
+ ----------
1431
+ customer_id : str
1432
+ Unique identifier of the customer in the Pine Labs Online database.
1433
+
1434
+ token_id : str
1435
+ Unique token ID to retrieve.
1436
+
1437
+ request_options : typing.Optional[RequestOptions]
1438
+ Request-specific configuration.
1439
+
1440
+ Returns
1441
+ -------
1442
+ AsyncHttpResponse[CustomerTokenDetail]
1443
+ Customer token details retrieved successfully.
1444
+ """
1445
+ _response = await self._client_wrapper.httpx_client.request(
1446
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens/{encode_path_param(token_id)}",
1447
+ method="GET",
1448
+ request_options=request_options,
1449
+ )
1450
+ try:
1451
+ if 200 <= _response.status_code < 300:
1452
+ _data = typing.cast(
1453
+ CustomerTokenDetail,
1454
+ parse_obj_as(
1455
+ type_=CustomerTokenDetail, # type: ignore
1456
+ object_=_response.json(),
1457
+ ),
1458
+ )
1459
+ return AsyncHttpResponse(response=_response, data=_data)
1460
+ if _response.status_code == 400:
1461
+ raise BadRequestError(
1462
+ headers=dict(_response.headers),
1463
+ body=typing.cast(
1464
+ typing.Any,
1465
+ parse_obj_as(
1466
+ type_=typing.Any, # type: ignore
1467
+ object_=_response.json(),
1468
+ ),
1469
+ ),
1470
+ )
1471
+ if _response.status_code == 401:
1472
+ raise UnauthorizedError(
1473
+ headers=dict(_response.headers),
1474
+ body=typing.cast(
1475
+ ErrorResponse,
1476
+ parse_obj_as(
1477
+ type_=ErrorResponse, # type: ignore
1478
+ object_=_response.json(),
1479
+ ),
1480
+ ),
1481
+ )
1482
+ if _response.status_code == 403:
1483
+ raise ForbiddenError(
1484
+ headers=dict(_response.headers),
1485
+ body=typing.cast(
1486
+ ErrorResponse,
1487
+ parse_obj_as(
1488
+ type_=ErrorResponse, # type: ignore
1489
+ object_=_response.json(),
1490
+ ),
1491
+ ),
1492
+ )
1493
+ if _response.status_code == 404:
1494
+ raise NotFoundError(
1495
+ headers=dict(_response.headers),
1496
+ body=typing.cast(
1497
+ ErrorResponse,
1498
+ parse_obj_as(
1499
+ type_=ErrorResponse, # type: ignore
1500
+ object_=_response.json(),
1501
+ ),
1502
+ ),
1503
+ )
1504
+ if _response.status_code == 500:
1505
+ raise InternalServerError(
1506
+ headers=dict(_response.headers),
1507
+ body=typing.cast(
1508
+ ErrorResponse,
1509
+ parse_obj_as(
1510
+ type_=ErrorResponse, # type: ignore
1511
+ object_=_response.json(),
1512
+ ),
1513
+ ),
1514
+ )
1515
+ _response_json = _response.json()
1516
+ except JSONDecodeError:
1517
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1518
+ except ValidationError as e:
1519
+ raise ParsingError(
1520
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1521
+ )
1522
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1523
+
1524
+ async def delete_customer_token(
1525
+ self,
1526
+ customer_id: str,
1527
+ token_id: str,
1528
+ *,
1529
+ merchant_unique_reference: str,
1530
+ merchant_metadata: typing.Optional[MerchantMetadata] = OMIT,
1531
+ request_options: typing.Optional[RequestOptions] = None,
1532
+ ) -> AsyncHttpResponse[DeleteCustomerTokenResponse]:
1533
+ """
1534
+ Delete a specific token linked to a customer by both the customer ID and token ID.
1535
+ Requires a unique merchant reference for the delete operation.
1536
+
1537
+ Parameters
1538
+ ----------
1539
+ customer_id : str
1540
+ Unique identifier of the customer in the Pine Labs Online database.
1541
+
1542
+ token_id : str
1543
+ Unique token ID to delete.
1544
+
1545
+ merchant_unique_reference : str
1546
+ Unique reference for this delete operation.
1547
+
1548
+ merchant_metadata : typing.Optional[MerchantMetadata]
1549
+
1550
+ request_options : typing.Optional[RequestOptions]
1551
+ Request-specific configuration.
1552
+
1553
+ Returns
1554
+ -------
1555
+ AsyncHttpResponse[DeleteCustomerTokenResponse]
1556
+ Customer token deleted successfully.
1557
+ """
1558
+ _response = await self._client_wrapper.httpx_client.request(
1559
+ f"api/v1/customer/{encode_path_param(customer_id)}/tokens/{encode_path_param(token_id)}/delete",
1560
+ method="POST",
1561
+ json={
1562
+ "merchant_unique_reference": merchant_unique_reference,
1563
+ "merchant_metadata": merchant_metadata,
1564
+ },
1565
+ headers={
1566
+ "content-type": "application/json",
1567
+ },
1568
+ request_options=request_options,
1569
+ omit=OMIT,
1570
+ )
1571
+ try:
1572
+ if 200 <= _response.status_code < 300:
1573
+ _data = typing.cast(
1574
+ DeleteCustomerTokenResponse,
1575
+ parse_obj_as(
1576
+ type_=DeleteCustomerTokenResponse, # type: ignore
1577
+ object_=_response.json(),
1578
+ ),
1579
+ )
1580
+ return AsyncHttpResponse(response=_response, data=_data)
1581
+ if _response.status_code == 400:
1582
+ raise BadRequestError(
1583
+ headers=dict(_response.headers),
1584
+ body=typing.cast(
1585
+ typing.Any,
1586
+ parse_obj_as(
1587
+ type_=typing.Any, # type: ignore
1588
+ object_=_response.json(),
1589
+ ),
1590
+ ),
1591
+ )
1592
+ if _response.status_code == 401:
1593
+ raise UnauthorizedError(
1594
+ headers=dict(_response.headers),
1595
+ body=typing.cast(
1596
+ ErrorResponse,
1597
+ parse_obj_as(
1598
+ type_=ErrorResponse, # type: ignore
1599
+ object_=_response.json(),
1600
+ ),
1601
+ ),
1602
+ )
1603
+ if _response.status_code == 403:
1604
+ raise ForbiddenError(
1605
+ headers=dict(_response.headers),
1606
+ body=typing.cast(
1607
+ ErrorResponse,
1608
+ parse_obj_as(
1609
+ type_=ErrorResponse, # type: ignore
1610
+ object_=_response.json(),
1611
+ ),
1612
+ ),
1613
+ )
1614
+ if _response.status_code == 404:
1615
+ raise NotFoundError(
1616
+ headers=dict(_response.headers),
1617
+ body=typing.cast(
1618
+ ErrorResponse,
1619
+ parse_obj_as(
1620
+ type_=ErrorResponse, # type: ignore
1621
+ object_=_response.json(),
1622
+ ),
1623
+ ),
1624
+ )
1625
+ if _response.status_code == 500:
1626
+ raise InternalServerError(
1627
+ headers=dict(_response.headers),
1628
+ body=typing.cast(
1629
+ ErrorResponse,
1630
+ parse_obj_as(
1631
+ type_=ErrorResponse, # type: ignore
1632
+ object_=_response.json(),
1633
+ ),
1634
+ ),
1635
+ )
1636
+ _response_json = _response.json()
1637
+ except JSONDecodeError:
1638
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1639
+ except ValidationError as e:
1640
+ raise ParsingError(
1641
+ status_code=_response.status_code, headers=dict(_response.headers), body=_response.json(), cause=e
1642
+ )
1643
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)