subnoto-api-client 1.0.1__py3-none-manylinux2014_x86_64.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 (399) hide show
  1. __init__.py +34 -0
  2. subnoto_api_client/__init__.py +23 -0
  3. subnoto_api_client/client.py +155 -0
  4. subnoto_api_client/generated/__init__.py +8 -0
  5. subnoto_api_client/generated/api/__init__.py +1 -0
  6. subnoto_api_client/generated/api/contact/__init__.py +1 -0
  7. subnoto_api_client/generated/api/contact/post_public_contact_create.py +241 -0
  8. subnoto_api_client/generated/api/contact/post_public_contact_delete.py +241 -0
  9. subnoto_api_client/generated/api/contact/post_public_contact_get.py +241 -0
  10. subnoto_api_client/generated/api/contact/post_public_contact_list.py +241 -0
  11. subnoto_api_client/generated/api/contact/post_public_contact_update.py +241 -0
  12. subnoto_api_client/generated/api/envelope/__init__.py +1 -0
  13. subnoto_api_client/generated/api/envelope/post_public_envelope_add_blocks.py +243 -0
  14. subnoto_api_client/generated/api/envelope/post_public_envelope_add_recipients.py +253 -0
  15. subnoto_api_client/generated/api/envelope/post_public_envelope_complete_document_upload.py +257 -0
  16. subnoto_api_client/generated/api/envelope/post_public_envelope_create.py +253 -0
  17. subnoto_api_client/generated/api/envelope/post_public_envelope_create_from_template.py +257 -0
  18. subnoto_api_client/generated/api/envelope/post_public_envelope_delete.py +241 -0
  19. subnoto_api_client/generated/api/envelope/post_public_envelope_delete_blocks.py +253 -0
  20. subnoto_api_client/generated/api/envelope/post_public_envelope_delete_recipients.py +253 -0
  21. subnoto_api_client/generated/api/envelope/post_public_envelope_get.py +241 -0
  22. subnoto_api_client/generated/api/envelope/post_public_envelope_get_document.py +247 -0
  23. subnoto_api_client/generated/api/envelope/post_public_envelope_get_proof.py +237 -0
  24. subnoto_api_client/generated/api/envelope/post_public_envelope_list.py +227 -0
  25. subnoto_api_client/generated/api/envelope/post_public_envelope_send.py +241 -0
  26. subnoto_api_client/generated/api/envelope/post_public_envelope_sign.py +241 -0
  27. subnoto_api_client/generated/api/template/__init__.py +1 -0
  28. subnoto_api_client/generated/api/template/post_public_template_list.py +227 -0
  29. subnoto_api_client/generated/api/utils/__init__.py +1 -0
  30. subnoto_api_client/generated/api/utils/post_public_utils_whoami.py +227 -0
  31. subnoto_api_client/generated/api/workspace/__init__.py +1 -0
  32. subnoto_api_client/generated/api/workspace/post_public_workspace_list.py +227 -0
  33. subnoto_api_client/generated/client.py +282 -0
  34. subnoto_api_client/generated/errors.py +16 -0
  35. subnoto_api_client/generated/models/__init__.py +1271 -0
  36. subnoto_api_client/generated/models/post_public_contact_create_body.py +89 -0
  37. subnoto_api_client/generated/models/post_public_contact_create_body_contacts_item.py +88 -0
  38. subnoto_api_client/generated/models/post_public_contact_create_response_200.py +62 -0
  39. subnoto_api_client/generated/models/post_public_contact_create_response_200_contacts_item.py +80 -0
  40. subnoto_api_client/generated/models/post_public_contact_create_response_400.py +84 -0
  41. subnoto_api_client/generated/models/post_public_contact_create_response_400_error.py +70 -0
  42. subnoto_api_client/generated/models/post_public_contact_create_response_400_error_code.py +10 -0
  43. subnoto_api_client/generated/models/post_public_contact_create_response_401.py +84 -0
  44. subnoto_api_client/generated/models/post_public_contact_create_response_401_error.py +70 -0
  45. subnoto_api_client/generated/models/post_public_contact_create_response_401_error_code.py +10 -0
  46. subnoto_api_client/generated/models/post_public_contact_create_response_403.py +84 -0
  47. subnoto_api_client/generated/models/post_public_contact_create_response_403_error.py +70 -0
  48. subnoto_api_client/generated/models/post_public_contact_create_response_403_error_code.py +9 -0
  49. subnoto_api_client/generated/models/post_public_contact_create_response_500.py +84 -0
  50. subnoto_api_client/generated/models/post_public_contact_create_response_500_error.py +70 -0
  51. subnoto_api_client/generated/models/post_public_contact_create_response_500_error_code.py +9 -0
  52. subnoto_api_client/generated/models/post_public_contact_delete_body.py +69 -0
  53. subnoto_api_client/generated/models/post_public_contact_delete_response_200.py +24 -0
  54. subnoto_api_client/generated/models/post_public_contact_delete_response_400.py +84 -0
  55. subnoto_api_client/generated/models/post_public_contact_delete_response_400_error.py +70 -0
  56. subnoto_api_client/generated/models/post_public_contact_delete_response_400_error_code.py +10 -0
  57. subnoto_api_client/generated/models/post_public_contact_delete_response_401.py +84 -0
  58. subnoto_api_client/generated/models/post_public_contact_delete_response_401_error.py +70 -0
  59. subnoto_api_client/generated/models/post_public_contact_delete_response_401_error_code.py +10 -0
  60. subnoto_api_client/generated/models/post_public_contact_delete_response_403.py +84 -0
  61. subnoto_api_client/generated/models/post_public_contact_delete_response_403_error.py +70 -0
  62. subnoto_api_client/generated/models/post_public_contact_delete_response_403_error_code.py +9 -0
  63. subnoto_api_client/generated/models/post_public_contact_delete_response_500.py +84 -0
  64. subnoto_api_client/generated/models/post_public_contact_delete_response_500_error.py +70 -0
  65. subnoto_api_client/generated/models/post_public_contact_delete_response_500_error_code.py +9 -0
  66. subnoto_api_client/generated/models/post_public_contact_get_body.py +69 -0
  67. subnoto_api_client/generated/models/post_public_contact_get_response_200.py +52 -0
  68. subnoto_api_client/generated/models/post_public_contact_get_response_200_contact.py +80 -0
  69. subnoto_api_client/generated/models/post_public_contact_get_response_400.py +84 -0
  70. subnoto_api_client/generated/models/post_public_contact_get_response_400_error.py +70 -0
  71. subnoto_api_client/generated/models/post_public_contact_get_response_400_error_code.py +10 -0
  72. subnoto_api_client/generated/models/post_public_contact_get_response_401.py +84 -0
  73. subnoto_api_client/generated/models/post_public_contact_get_response_401_error.py +70 -0
  74. subnoto_api_client/generated/models/post_public_contact_get_response_401_error_code.py +10 -0
  75. subnoto_api_client/generated/models/post_public_contact_get_response_403.py +84 -0
  76. subnoto_api_client/generated/models/post_public_contact_get_response_403_error.py +70 -0
  77. subnoto_api_client/generated/models/post_public_contact_get_response_403_error_code.py +9 -0
  78. subnoto_api_client/generated/models/post_public_contact_get_response_500.py +84 -0
  79. subnoto_api_client/generated/models/post_public_contact_get_response_500_error.py +70 -0
  80. subnoto_api_client/generated/models/post_public_contact_get_response_500_error_code.py +9 -0
  81. subnoto_api_client/generated/models/post_public_contact_list_body.py +61 -0
  82. subnoto_api_client/generated/models/post_public_contact_list_response_200.py +62 -0
  83. subnoto_api_client/generated/models/post_public_contact_list_response_200_contacts_item.py +80 -0
  84. subnoto_api_client/generated/models/post_public_contact_list_response_400.py +84 -0
  85. subnoto_api_client/generated/models/post_public_contact_list_response_400_error.py +70 -0
  86. subnoto_api_client/generated/models/post_public_contact_list_response_400_error_code.py +9 -0
  87. subnoto_api_client/generated/models/post_public_contact_list_response_401.py +84 -0
  88. subnoto_api_client/generated/models/post_public_contact_list_response_401_error.py +70 -0
  89. subnoto_api_client/generated/models/post_public_contact_list_response_401_error_code.py +10 -0
  90. subnoto_api_client/generated/models/post_public_contact_list_response_403.py +84 -0
  91. subnoto_api_client/generated/models/post_public_contact_list_response_403_error.py +70 -0
  92. subnoto_api_client/generated/models/post_public_contact_list_response_403_error_code.py +9 -0
  93. subnoto_api_client/generated/models/post_public_contact_list_response_500.py +84 -0
  94. subnoto_api_client/generated/models/post_public_contact_list_response_500_error.py +70 -0
  95. subnoto_api_client/generated/models/post_public_contact_list_response_500_error_code.py +9 -0
  96. subnoto_api_client/generated/models/post_public_contact_update_body.py +79 -0
  97. subnoto_api_client/generated/models/post_public_contact_update_body_contact.py +91 -0
  98. subnoto_api_client/generated/models/post_public_contact_update_response_200.py +52 -0
  99. subnoto_api_client/generated/models/post_public_contact_update_response_200_contact.py +80 -0
  100. subnoto_api_client/generated/models/post_public_contact_update_response_400.py +84 -0
  101. subnoto_api_client/generated/models/post_public_contact_update_response_400_error.py +70 -0
  102. subnoto_api_client/generated/models/post_public_contact_update_response_400_error_code.py +11 -0
  103. subnoto_api_client/generated/models/post_public_contact_update_response_401.py +84 -0
  104. subnoto_api_client/generated/models/post_public_contact_update_response_401_error.py +70 -0
  105. subnoto_api_client/generated/models/post_public_contact_update_response_401_error_code.py +10 -0
  106. subnoto_api_client/generated/models/post_public_contact_update_response_403.py +84 -0
  107. subnoto_api_client/generated/models/post_public_contact_update_response_403_error.py +70 -0
  108. subnoto_api_client/generated/models/post_public_contact_update_response_403_error_code.py +9 -0
  109. subnoto_api_client/generated/models/post_public_contact_update_response_500.py +84 -0
  110. subnoto_api_client/generated/models/post_public_contact_update_response_500_error.py +70 -0
  111. subnoto_api_client/generated/models/post_public_contact_update_response_500_error_code.py +9 -0
  112. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body.py +174 -0
  113. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0.py +153 -0
  114. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0_templated_text.py +10 -0
  115. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0_type.py +8 -0
  116. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_1.py +133 -0
  117. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_1_type.py +8 -0
  118. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_2.py +117 -0
  119. subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_2_type.py +8 -0
  120. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_200.py +42 -0
  121. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400.py +84 -0
  122. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400_error.py +70 -0
  123. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400_error_code.py +13 -0
  124. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401.py +84 -0
  125. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401_error.py +70 -0
  126. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401_error_code.py +10 -0
  127. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403.py +84 -0
  128. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403_error.py +70 -0
  129. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403_error_code.py +9 -0
  130. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500.py +84 -0
  131. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500_error.py +70 -0
  132. subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500_error_code.py +9 -0
  133. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body.py +171 -0
  134. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_0.py +91 -0
  135. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_0_type.py +8 -0
  136. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_1.py +75 -0
  137. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_1_type.py +8 -0
  138. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_2.py +75 -0
  139. subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_2_type.py +8 -0
  140. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200.py +64 -0
  141. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item.py +93 -0
  142. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item_role.py +8 -0
  143. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item_status.py +12 -0
  144. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400.py +86 -0
  145. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400_error.py +70 -0
  146. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400_error_code.py +14 -0
  147. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401.py +86 -0
  148. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401_error.py +70 -0
  149. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401_error_code.py +10 -0
  150. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403.py +86 -0
  151. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403_error.py +70 -0
  152. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403_error_code.py +9 -0
  153. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500.py +86 -0
  154. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500_error.py +70 -0
  155. subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500_error_code.py +9 -0
  156. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_body.py +77 -0
  157. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_200.py +24 -0
  158. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400.py +86 -0
  159. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400_error.py +72 -0
  160. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400_error_code.py +14 -0
  161. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401.py +86 -0
  162. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401_error.py +72 -0
  163. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401_error_code.py +10 -0
  164. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403.py +86 -0
  165. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403_error.py +72 -0
  166. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403_error_code.py +9 -0
  167. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500.py +86 -0
  168. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500_error.py +72 -0
  169. subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500_error_code.py +9 -0
  170. subnoto_api_client/generated/models/post_public_envelope_create_body.py +81 -0
  171. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body.py +170 -0
  172. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_0.py +99 -0
  173. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_0_type.py +8 -0
  174. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_1.py +83 -0
  175. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_1_type.py +8 -0
  176. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_2.py +83 -0
  177. subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_2_type.py +8 -0
  178. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_200.py +50 -0
  179. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400.py +86 -0
  180. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400_error.py +70 -0
  181. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400_error_code.py +13 -0
  182. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401.py +86 -0
  183. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401_error.py +70 -0
  184. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401_error_code.py +10 -0
  185. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403.py +86 -0
  186. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403_error.py +70 -0
  187. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403_error_code.py +9 -0
  188. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500.py +86 -0
  189. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500_error.py +70 -0
  190. subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500_error_code.py +9 -0
  191. subnoto_api_client/generated/models/post_public_envelope_create_response_200.py +95 -0
  192. subnoto_api_client/generated/models/post_public_envelope_create_response_200_presigned_s3_params.py +63 -0
  193. subnoto_api_client/generated/models/post_public_envelope_create_response_200_presigned_s3_params_fields.py +99 -0
  194. subnoto_api_client/generated/models/post_public_envelope_create_response_400.py +84 -0
  195. subnoto_api_client/generated/models/post_public_envelope_create_response_400_error.py +70 -0
  196. subnoto_api_client/generated/models/post_public_envelope_create_response_400_error_code.py +12 -0
  197. subnoto_api_client/generated/models/post_public_envelope_create_response_401.py +84 -0
  198. subnoto_api_client/generated/models/post_public_envelope_create_response_401_error.py +70 -0
  199. subnoto_api_client/generated/models/post_public_envelope_create_response_401_error_code.py +10 -0
  200. subnoto_api_client/generated/models/post_public_envelope_create_response_403.py +84 -0
  201. subnoto_api_client/generated/models/post_public_envelope_create_response_403_error.py +70 -0
  202. subnoto_api_client/generated/models/post_public_envelope_create_response_403_error_code.py +9 -0
  203. subnoto_api_client/generated/models/post_public_envelope_create_response_500.py +84 -0
  204. subnoto_api_client/generated/models/post_public_envelope_create_response_500_error.py +70 -0
  205. subnoto_api_client/generated/models/post_public_envelope_create_response_500_error_code.py +9 -0
  206. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_body.py +85 -0
  207. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_200.py +42 -0
  208. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400.py +84 -0
  209. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400_error.py +70 -0
  210. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400_error_code.py +12 -0
  211. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401.py +84 -0
  212. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401_error.py +70 -0
  213. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401_error_code.py +10 -0
  214. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403.py +84 -0
  215. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403_error.py +70 -0
  216. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403_error_code.py +9 -0
  217. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500.py +84 -0
  218. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500_error.py +70 -0
  219. subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500_error_code.py +9 -0
  220. subnoto_api_client/generated/models/post_public_envelope_delete_body.py +69 -0
  221. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_body.py +99 -0
  222. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_body_recipients_item.py +61 -0
  223. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_200.py +24 -0
  224. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400.py +86 -0
  225. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400_error.py +70 -0
  226. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400_error_code.py +12 -0
  227. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401.py +86 -0
  228. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401_error.py +70 -0
  229. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401_error_code.py +10 -0
  230. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403.py +86 -0
  231. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403_error.py +70 -0
  232. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403_error_code.py +9 -0
  233. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500.py +86 -0
  234. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500_error.py +70 -0
  235. subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500_error_code.py +9 -0
  236. subnoto_api_client/generated/models/post_public_envelope_delete_response_200.py +24 -0
  237. subnoto_api_client/generated/models/post_public_envelope_delete_response_400.py +84 -0
  238. subnoto_api_client/generated/models/post_public_envelope_delete_response_400_error.py +70 -0
  239. subnoto_api_client/generated/models/post_public_envelope_delete_response_400_error_code.py +10 -0
  240. subnoto_api_client/generated/models/post_public_envelope_delete_response_401.py +84 -0
  241. subnoto_api_client/generated/models/post_public_envelope_delete_response_401_error.py +70 -0
  242. subnoto_api_client/generated/models/post_public_envelope_delete_response_401_error_code.py +10 -0
  243. subnoto_api_client/generated/models/post_public_envelope_delete_response_403.py +84 -0
  244. subnoto_api_client/generated/models/post_public_envelope_delete_response_403_error.py +70 -0
  245. subnoto_api_client/generated/models/post_public_envelope_delete_response_403_error_code.py +9 -0
  246. subnoto_api_client/generated/models/post_public_envelope_delete_response_500.py +84 -0
  247. subnoto_api_client/generated/models/post_public_envelope_delete_response_500_error.py +70 -0
  248. subnoto_api_client/generated/models/post_public_envelope_delete_response_500_error_code.py +9 -0
  249. subnoto_api_client/generated/models/post_public_envelope_get_body.py +69 -0
  250. subnoto_api_client/generated/models/post_public_envelope_get_document_body.py +77 -0
  251. subnoto_api_client/generated/models/post_public_envelope_get_document_response_400.py +84 -0
  252. subnoto_api_client/generated/models/post_public_envelope_get_document_response_400_error.py +70 -0
  253. subnoto_api_client/generated/models/post_public_envelope_get_document_response_400_error_code.py +13 -0
  254. subnoto_api_client/generated/models/post_public_envelope_get_document_response_401.py +84 -0
  255. subnoto_api_client/generated/models/post_public_envelope_get_document_response_401_error.py +70 -0
  256. subnoto_api_client/generated/models/post_public_envelope_get_document_response_401_error_code.py +10 -0
  257. subnoto_api_client/generated/models/post_public_envelope_get_document_response_403.py +84 -0
  258. subnoto_api_client/generated/models/post_public_envelope_get_document_response_403_error.py +70 -0
  259. subnoto_api_client/generated/models/post_public_envelope_get_document_response_403_error_code.py +9 -0
  260. subnoto_api_client/generated/models/post_public_envelope_get_document_response_500.py +84 -0
  261. subnoto_api_client/generated/models/post_public_envelope_get_document_response_500_error.py +70 -0
  262. subnoto_api_client/generated/models/post_public_envelope_get_document_response_500_error_code.py +9 -0
  263. subnoto_api_client/generated/models/post_public_envelope_get_proof_body.py +69 -0
  264. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400.py +84 -0
  265. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400_error.py +70 -0
  266. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400_error_code.py +13 -0
  267. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401.py +84 -0
  268. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401_error.py +70 -0
  269. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401_error_code.py +10 -0
  270. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403.py +84 -0
  271. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403_error.py +70 -0
  272. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403_error_code.py +9 -0
  273. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500.py +84 -0
  274. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500_error.py +70 -0
  275. subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500_error_code.py +9 -0
  276. subnoto_api_client/generated/models/post_public_envelope_get_response_200.py +170 -0
  277. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item.py +106 -0
  278. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks.py +162 -0
  279. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0.py +236 -0
  280. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_color.py +15 -0
  281. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_label_icon.py +14 -0
  282. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_templated_text.py +12 -0
  283. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_type.py +10 -0
  284. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1.py +207 -0
  285. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_color.py +15 -0
  286. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_label_icon.py +14 -0
  287. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_type.py +10 -0
  288. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2.py +191 -0
  289. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_color.py +15 -0
  290. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_label_icon.py +14 -0
  291. subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_type.py +10 -0
  292. subnoto_api_client/generated/models/post_public_envelope_get_response_200_metrics.py +66 -0
  293. subnoto_api_client/generated/models/post_public_envelope_get_response_200_owner.py +93 -0
  294. subnoto_api_client/generated/models/post_public_envelope_get_response_200_sender.py +51 -0
  295. subnoto_api_client/generated/models/post_public_envelope_get_response_200_status.py +14 -0
  296. subnoto_api_client/generated/models/post_public_envelope_get_response_400.py +84 -0
  297. subnoto_api_client/generated/models/post_public_envelope_get_response_400_error.py +70 -0
  298. subnoto_api_client/generated/models/post_public_envelope_get_response_400_error_code.py +10 -0
  299. subnoto_api_client/generated/models/post_public_envelope_get_response_401.py +84 -0
  300. subnoto_api_client/generated/models/post_public_envelope_get_response_401_error.py +70 -0
  301. subnoto_api_client/generated/models/post_public_envelope_get_response_401_error_code.py +10 -0
  302. subnoto_api_client/generated/models/post_public_envelope_get_response_403.py +84 -0
  303. subnoto_api_client/generated/models/post_public_envelope_get_response_403_error.py +70 -0
  304. subnoto_api_client/generated/models/post_public_envelope_get_response_403_error_code.py +9 -0
  305. subnoto_api_client/generated/models/post_public_envelope_get_response_500.py +84 -0
  306. subnoto_api_client/generated/models/post_public_envelope_get_response_500_error.py +70 -0
  307. subnoto_api_client/generated/models/post_public_envelope_get_response_500_error_code.py +9 -0
  308. subnoto_api_client/generated/models/post_public_envelope_list_body.py +82 -0
  309. subnoto_api_client/generated/models/post_public_envelope_list_response_200.py +62 -0
  310. subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item.py +144 -0
  311. subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_metrics.py +67 -0
  312. subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_owner.py +79 -0
  313. subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_status.py +14 -0
  314. subnoto_api_client/generated/models/post_public_envelope_list_response_401.py +84 -0
  315. subnoto_api_client/generated/models/post_public_envelope_list_response_401_error.py +70 -0
  316. subnoto_api_client/generated/models/post_public_envelope_list_response_401_error_code.py +10 -0
  317. subnoto_api_client/generated/models/post_public_envelope_list_response_403.py +84 -0
  318. subnoto_api_client/generated/models/post_public_envelope_list_response_403_error.py +70 -0
  319. subnoto_api_client/generated/models/post_public_envelope_list_response_403_error_code.py +9 -0
  320. subnoto_api_client/generated/models/post_public_envelope_list_response_500.py +84 -0
  321. subnoto_api_client/generated/models/post_public_envelope_list_response_500_error.py +70 -0
  322. subnoto_api_client/generated/models/post_public_envelope_list_response_500_error_code.py +9 -0
  323. subnoto_api_client/generated/models/post_public_envelope_send_body.py +90 -0
  324. subnoto_api_client/generated/models/post_public_envelope_send_response_200.py +24 -0
  325. subnoto_api_client/generated/models/post_public_envelope_send_response_400.py +84 -0
  326. subnoto_api_client/generated/models/post_public_envelope_send_response_400_error.py +70 -0
  327. subnoto_api_client/generated/models/post_public_envelope_send_response_400_error_code.py +15 -0
  328. subnoto_api_client/generated/models/post_public_envelope_send_response_401.py +84 -0
  329. subnoto_api_client/generated/models/post_public_envelope_send_response_401_error.py +70 -0
  330. subnoto_api_client/generated/models/post_public_envelope_send_response_401_error_code.py +10 -0
  331. subnoto_api_client/generated/models/post_public_envelope_send_response_403.py +84 -0
  332. subnoto_api_client/generated/models/post_public_envelope_send_response_403_error.py +70 -0
  333. subnoto_api_client/generated/models/post_public_envelope_send_response_403_error_code.py +9 -0
  334. subnoto_api_client/generated/models/post_public_envelope_send_response_500.py +84 -0
  335. subnoto_api_client/generated/models/post_public_envelope_send_response_500_error.py +70 -0
  336. subnoto_api_client/generated/models/post_public_envelope_send_response_500_error_code.py +9 -0
  337. subnoto_api_client/generated/models/post_public_envelope_sign_body.py +88 -0
  338. subnoto_api_client/generated/models/post_public_envelope_sign_response_200.py +58 -0
  339. subnoto_api_client/generated/models/post_public_envelope_sign_response_400.py +84 -0
  340. subnoto_api_client/generated/models/post_public_envelope_sign_response_400_error.py +70 -0
  341. subnoto_api_client/generated/models/post_public_envelope_sign_response_400_error_code.py +16 -0
  342. subnoto_api_client/generated/models/post_public_envelope_sign_response_401.py +84 -0
  343. subnoto_api_client/generated/models/post_public_envelope_sign_response_401_error.py +70 -0
  344. subnoto_api_client/generated/models/post_public_envelope_sign_response_401_error_code.py +10 -0
  345. subnoto_api_client/generated/models/post_public_envelope_sign_response_403.py +84 -0
  346. subnoto_api_client/generated/models/post_public_envelope_sign_response_403_error.py +70 -0
  347. subnoto_api_client/generated/models/post_public_envelope_sign_response_403_error_code.py +9 -0
  348. subnoto_api_client/generated/models/post_public_envelope_sign_response_500.py +84 -0
  349. subnoto_api_client/generated/models/post_public_envelope_sign_response_500_error.py +70 -0
  350. subnoto_api_client/generated/models/post_public_envelope_sign_response_500_error_code.py +9 -0
  351. subnoto_api_client/generated/models/post_public_template_list_body.py +52 -0
  352. subnoto_api_client/generated/models/post_public_template_list_response_200.py +62 -0
  353. subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item.py +174 -0
  354. subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_documents_item.py +50 -0
  355. subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_owner.py +79 -0
  356. subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_recipients_item.py +42 -0
  357. subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_status.py +11 -0
  358. subnoto_api_client/generated/models/post_public_template_list_response_401.py +84 -0
  359. subnoto_api_client/generated/models/post_public_template_list_response_401_error.py +70 -0
  360. subnoto_api_client/generated/models/post_public_template_list_response_401_error_code.py +10 -0
  361. subnoto_api_client/generated/models/post_public_template_list_response_403.py +84 -0
  362. subnoto_api_client/generated/models/post_public_template_list_response_403_error.py +70 -0
  363. subnoto_api_client/generated/models/post_public_template_list_response_403_error_code.py +9 -0
  364. subnoto_api_client/generated/models/post_public_template_list_response_500.py +84 -0
  365. subnoto_api_client/generated/models/post_public_template_list_response_500_error.py +70 -0
  366. subnoto_api_client/generated/models/post_public_template_list_response_500_error_code.py +9 -0
  367. subnoto_api_client/generated/models/post_public_utils_whoami_body.py +46 -0
  368. subnoto_api_client/generated/models/post_public_utils_whoami_response_200.py +74 -0
  369. subnoto_api_client/generated/models/post_public_utils_whoami_response_401.py +84 -0
  370. subnoto_api_client/generated/models/post_public_utils_whoami_response_401_error.py +70 -0
  371. subnoto_api_client/generated/models/post_public_utils_whoami_response_401_error_code.py +10 -0
  372. subnoto_api_client/generated/models/post_public_utils_whoami_response_403.py +84 -0
  373. subnoto_api_client/generated/models/post_public_utils_whoami_response_403_error.py +70 -0
  374. subnoto_api_client/generated/models/post_public_utils_whoami_response_403_error_code.py +9 -0
  375. subnoto_api_client/generated/models/post_public_utils_whoami_response_500.py +84 -0
  376. subnoto_api_client/generated/models/post_public_utils_whoami_response_500_error.py +70 -0
  377. subnoto_api_client/generated/models/post_public_utils_whoami_response_500_error_code.py +9 -0
  378. subnoto_api_client/generated/models/post_public_workspace_list_body.py +46 -0
  379. subnoto_api_client/generated/models/post_public_workspace_list_response_200.py +64 -0
  380. subnoto_api_client/generated/models/post_public_workspace_list_response_200_workspaces_item.py +74 -0
  381. subnoto_api_client/generated/models/post_public_workspace_list_response_401.py +84 -0
  382. subnoto_api_client/generated/models/post_public_workspace_list_response_401_error.py +70 -0
  383. subnoto_api_client/generated/models/post_public_workspace_list_response_401_error_code.py +10 -0
  384. subnoto_api_client/generated/models/post_public_workspace_list_response_403.py +84 -0
  385. subnoto_api_client/generated/models/post_public_workspace_list_response_403_error.py +70 -0
  386. subnoto_api_client/generated/models/post_public_workspace_list_response_403_error_code.py +9 -0
  387. subnoto_api_client/generated/models/post_public_workspace_list_response_500.py +84 -0
  388. subnoto_api_client/generated/models/post_public_workspace_list_response_500_error.py +70 -0
  389. subnoto_api_client/generated/models/post_public_workspace_list_response_500_error_code.py +9 -0
  390. subnoto_api_client/generated/types.py +54 -0
  391. subnoto_api_client/middleware/__init__.py +15 -0
  392. subnoto_api_client/middleware/signature_utils.py +128 -0
  393. subnoto_api_client/middleware/tunnel.py +119 -0
  394. subnoto_api_client/session.py +239 -0
  395. subnoto_api_client/transport.py +156 -0
  396. subnoto_api_client/types.py +43 -0
  397. subnoto_api_client-1.0.1.dist-info/METADATA +97 -0
  398. subnoto_api_client-1.0.1.dist-info/RECORD +399 -0
  399. subnoto_api_client-1.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,156 @@
1
+ # Copyright 2025 Subnoto
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ """
17
+ Simplified transport using pure httpx with signature generation
18
+ """
19
+
20
+ from typing import TYPE_CHECKING
21
+ import httpx
22
+
23
+ from .middleware.signature_utils import sign_request_headers
24
+ from .types import SubnotoError
25
+
26
+ if TYPE_CHECKING:
27
+ from .session import SessionManager
28
+
29
+
30
+ class TunnelTransport(httpx.AsyncHTTPTransport):
31
+ """Custom transport using httpx for tunnel encryption and signatures"""
32
+
33
+ def __init__(self, session_manager: "SessionManager", access_key: str, secret_key: str, *args, **kwargs):
34
+ super().__init__(*args, **kwargs)
35
+ self.session_manager = session_manager
36
+ self.access_key = access_key
37
+ self.secret_key = secret_key
38
+
39
+ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
40
+ """Handle request with encryption and signature"""
41
+ url = str(request.url)
42
+ path = request.url.path
43
+
44
+ # Skip all processing for handshake requests
45
+ if path == "/tunnel/session":
46
+ return await super().handle_async_request(request)
47
+
48
+ # For local testing, skip encryption but still sign
49
+ is_local = "localhost" in str(request.url.host) or "127.0.0.1" in str(request.url.host)
50
+
51
+ # Check if this request needs tunnel encryption
52
+ needs_encryption = not is_local and (
53
+ path.startswith("/tunnel/") or (path.startswith("/public/") and request.method != "GET")
54
+ )
55
+
56
+ if needs_encryption:
57
+ # Ensure session is established
58
+ await self.session_manager.ensure_session()
59
+
60
+ # Read original content
61
+ await request.aread()
62
+ original_content = request.content
63
+
64
+ # Encrypt the content
65
+ encrypted_content = self.session_manager.encrypt_request(original_content)
66
+
67
+ # Get session ID
68
+ session_id = self.session_manager.get_session_id()
69
+ if not session_id:
70
+ raise SubnotoError("Session ID not available")
71
+
72
+ # Generate signature headers for ENCRYPTED content
73
+ signature_headers = sign_request_headers(
74
+ url=url,
75
+ method=request.method,
76
+ body_content=encrypted_content,
77
+ access_key=self.access_key,
78
+ secret_key=self.secret_key,
79
+ existing_headers={"content-type": "application/octet-stream"}
80
+ )
81
+
82
+ # Build new headers without duplicates
83
+ new_headers = dict(signature_headers)
84
+ new_headers["X-Session-Id"] = session_id
85
+
86
+ # Add cookies
87
+ cookies = self.session_manager._get_cookies_for_request(url)
88
+ if cookies:
89
+ new_headers["Cookie"] = cookies
90
+
91
+ # Create new request with encrypted content and signature headers
92
+ new_request = httpx.Request(
93
+ method=request.method,
94
+ url=request.url,
95
+ headers=new_headers,
96
+ content=encrypted_content,
97
+ extensions=request.extensions
98
+ )
99
+
100
+ # Send via parent transport
101
+ response = await super().handle_async_request(new_request)
102
+
103
+ # Decrypt if needed
104
+ if response.headers.get("x-subnoto-encrypted-response") == "true":
105
+ response_content = await response.aread()
106
+ decrypted_content = self.session_manager.decrypt_response(response_content)
107
+ response = httpx.Response(
108
+ status_code=response.status_code,
109
+ headers=response.headers,
110
+ content=decrypted_content,
111
+ request=request,
112
+ )
113
+
114
+ # Store cookies
115
+ self.session_manager._store_cookies(response, url)
116
+
117
+ return response
118
+ else:
119
+ # No encryption needed, but still sign
120
+ await request.aread()
121
+ body_content = request.content if request.content else b""
122
+
123
+ # Generate signature headers
124
+ signature_headers = sign_request_headers(
125
+ url=url,
126
+ method=request.method,
127
+ body_content=body_content,
128
+ access_key=self.access_key,
129
+ secret_key=self.secret_key,
130
+ existing_headers=dict(request.headers)
131
+ )
132
+
133
+ # Build new headers without duplicates
134
+ new_headers = dict(signature_headers)
135
+
136
+ # Add cookies
137
+ cookies = self.session_manager._get_cookies_for_request(url)
138
+ if cookies:
139
+ new_headers["Cookie"] = cookies
140
+
141
+ # Create new request with signature headers
142
+ new_request = httpx.Request(
143
+ method=request.method,
144
+ url=request.url,
145
+ headers=new_headers,
146
+ content=body_content,
147
+ extensions=request.extensions
148
+ )
149
+
150
+ # Send via parent transport
151
+ response = await super().handle_async_request(new_request)
152
+
153
+ # Store cookies
154
+ self.session_manager._store_cookies(response, url)
155
+
156
+ return response
@@ -0,0 +1,43 @@
1
+ # Copyright 2025 Subnoto
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #
15
+
16
+ from dataclasses import dataclass
17
+ from typing import Optional
18
+
19
+
20
+ @dataclass
21
+ class SubnotoConfig:
22
+ """Configuration for the Subnoto API client"""
23
+
24
+ api_base_url: str
25
+ access_key: str
26
+ secret_key: str
27
+ unattested: bool = False
28
+ attester_key: Optional[bytes] = None
29
+
30
+
31
+ class SubnotoError(Exception):
32
+ """Base exception for Subnoto API client errors"""
33
+
34
+ def __init__(self, message: str, status_code: Optional[int] = None):
35
+ self.message = message
36
+ self.status_code = status_code
37
+ super().__init__(self.message)
38
+
39
+ def __str__(self) -> str:
40
+ if self.status_code:
41
+ return f"SubnotoError({self.status_code}): {self.message}"
42
+ return f"SubnotoError: {self.message}"
43
+
@@ -0,0 +1,97 @@
1
+ Metadata-Version: 2.1
2
+ Name: subnoto-api-client
3
+ Author: Subnoto
4
+ Author-email: support@subnoto.com
5
+ Home-page: https://subnoto.com
6
+ License: Apache-2.0
7
+ Description-Content-Type: text/markdown
8
+ Summary: Python client for the Subnoto Public API
9
+ Project-URL: Documentation, https://subnoto.com/documentation/developers/sdks/python
10
+ Project-URL: Homepage, https://subnoto.com
11
+ Project-URL: Repository, https://gitlab.com/subnoto/subnoto-monorepo-public
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.8
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
23
+ Requires-Python: >=3.8
24
+ Requires-Dist: httpx
25
+ Requires-Dist: attrs
26
+ Requires-Dist: http-message-signatures
27
+ Version: 1.0.1
28
+
29
+ # Subnoto Python SDK
30
+
31
+ Python client for the Subnoto Public API
32
+
33
+ Note: the SDK is only available on the linux/amd64 platform for now
34
+
35
+ ## Installation
36
+
37
+ ```bash
38
+ pip install subnoto-api-client
39
+ ```
40
+
41
+ Or with Bazel:
42
+
43
+ ```python
44
+ # In your BUILD file
45
+ load("@pypi//:requirements.bzl", "requirement")
46
+
47
+ py_binary(
48
+ name = "my_app",
49
+ srcs = ["main.py"],
50
+ deps = [
51
+ "//libs/api-client-py:api_client_py",
52
+ ],
53
+ )
54
+ ```
55
+
56
+ ## Usage
57
+
58
+ ### Basic Example
59
+
60
+ ```python
61
+ import asyncio
62
+ from subnoto_api_client import SubnotoClient, SubnotoConfig
63
+
64
+ async def main():
65
+ # Create client with configuration
66
+ config = SubnotoConfig(
67
+ api_base_url="https://enclave.subnoto.com",
68
+ access_key="your-access-key",
69
+ secret_key="your-secret-key-hex",
70
+ unattested=True # Set to False for production with attestation
71
+ )
72
+
73
+ async with SubnotoClient(config) as client:
74
+ # List workspaces
75
+ response = await client.post("/public/workspace/list", json={})
76
+ workspaces = response.json()
77
+ print(f"Workspaces: {workspaces}")
78
+
79
+ # Get current user info
80
+ response = await client.post("/public/utils/whoami", json={})
81
+ user_info = response.json()
82
+ print(f"User: {user_info}")
83
+
84
+ if __name__ == "__main__":
85
+ asyncio.run(main())
86
+ ```
87
+
88
+ ## Configuration
89
+
90
+ | Option | Type | Required | Description |
91
+ | -------------- | ----- | -------- | -------------------------------------------------------------- |
92
+ | `api_base_url` | str | Yes | API base URL (e.g., `https://enclave.subnoto.com`) |
93
+ | `access_key` | str | Yes | API access key from your team settings |
94
+ | `secret_key` | str | Yes | API secret key (hex-encoded) from your team settings |
95
+ | `unattested` | bool | No | Use unattested mode for development (default: `False`) |
96
+ | `attester_key` | bytes | No | Public key for attestation verification (required if attested) |
97
+