subnoto-api-client 0.0.99__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.
- oak_py_sdk/oak_client.so +0 -0
- subnoto_api_client/__init__.py +23 -0
- subnoto_api_client/client.py +155 -0
- subnoto_api_client/generated/__init__.py +8 -0
- subnoto_api_client/generated/api/__init__.py +1 -0
- subnoto_api_client/generated/api/contact/__init__.py +1 -0
- subnoto_api_client/generated/api/contact/post_public_contact_create.py +241 -0
- subnoto_api_client/generated/api/contact/post_public_contact_delete.py +241 -0
- subnoto_api_client/generated/api/contact/post_public_contact_get.py +241 -0
- subnoto_api_client/generated/api/contact/post_public_contact_list.py +241 -0
- subnoto_api_client/generated/api/contact/post_public_contact_update.py +241 -0
- subnoto_api_client/generated/api/envelope/__init__.py +1 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_add_blocks.py +243 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_add_recipients.py +253 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_complete_document_upload.py +257 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_create.py +253 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_create_from_template.py +257 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_delete.py +241 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_delete_blocks.py +253 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_delete_recipients.py +253 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_get.py +241 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_get_document.py +247 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_get_proof.py +237 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_list.py +227 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_send.py +241 -0
- subnoto_api_client/generated/api/envelope/post_public_envelope_sign.py +241 -0
- subnoto_api_client/generated/api/template/__init__.py +1 -0
- subnoto_api_client/generated/api/template/post_public_template_list.py +227 -0
- subnoto_api_client/generated/api/utils/__init__.py +1 -0
- subnoto_api_client/generated/api/utils/post_public_utils_whoami.py +227 -0
- subnoto_api_client/generated/api/workspace/__init__.py +1 -0
- subnoto_api_client/generated/api/workspace/post_public_workspace_list.py +227 -0
- subnoto_api_client/generated/client.py +282 -0
- subnoto_api_client/generated/errors.py +16 -0
- subnoto_api_client/generated/models/__init__.py +1271 -0
- subnoto_api_client/generated/models/post_public_contact_create_body.py +89 -0
- subnoto_api_client/generated/models/post_public_contact_create_body_contacts_item.py +88 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_200.py +62 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_200_contacts_item.py +80 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_400_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_create_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_delete_body.py +69 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_200.py +24 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_400_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_delete_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_get_body.py +69 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_200.py +52 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_200_contact.py +80 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_400_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_get_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_list_body.py +61 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_200.py +62 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_200_contacts_item.py +80 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_400_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_list_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_update_body.py +79 -0
- subnoto_api_client/generated/models/post_public_contact_update_body_contact.py +91 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_200.py +52 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_200_contact.py +80 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_400_error_code.py +11 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_contact_update_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body.py +174 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0.py +153 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0_templated_text.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_0_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_1.py +133 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_1_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_2.py +117 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_body_blocks_item_type_2_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_200.py +42 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_400_error_code.py +13 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_blocks_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body.py +171 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_0.py +91 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_0_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_1.py +75 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_1_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_2.py +75 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_body_recipients_item_type_2_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200.py +64 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item.py +93 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item_role.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_200_recipients_item_status.py +12 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_400_error_code.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_add_recipients_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_body.py +77 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_200.py +24 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400_error.py +72 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_400_error_code.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401_error.py +72 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403_error.py +72 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500_error.py +72 -0
- subnoto_api_client/generated/models/post_public_envelope_complete_document_upload_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_create_body.py +81 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body.py +170 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_0.py +99 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_0_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_1.py +83 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_1_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_2.py +83 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_body_recipients_item_type_2_type.py +8 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_200.py +50 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_400_error_code.py +13 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_from_template_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_200.py +95 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_200_presigned_s3_params.py +63 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_200_presigned_s3_params_fields.py +99 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_400_error_code.py +12 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_create_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_body.py +85 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_200.py +42 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_400_error_code.py +12 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_blocks_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_body.py +69 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_body.py +99 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_body_recipients_item.py +61 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_200.py +24 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_400_error_code.py +12 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500.py +86 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_recipients_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_200.py +24 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_400_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_delete_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_body.py +69 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_body.py +77 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_400_error_code.py +13 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_document_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_body.py +69 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_400_error_code.py +13 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_proof_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200.py +170 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item.py +106 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks.py +162 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0.py +236 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_color.py +15 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_label_icon.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_templated_text.py +12 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_0_type.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1.py +207 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_color.py +15 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_label_icon.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_1_type.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2.py +191 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_color.py +15 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_label_icon.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_documents_item_blocks_additional_property_item_type_2_type.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_metrics.py +66 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_owner.py +93 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_sender.py +51 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_200_status.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_400_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_get_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_list_body.py +82 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_200.py +62 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item.py +144 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_metrics.py +67 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_owner.py +79 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_200_envelopes_item_status.py +14 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_list_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_send_body.py +90 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_200.py +24 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_400_error_code.py +15 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_send_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_body.py +88 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_200.py +58 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_400.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_400_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_400_error_code.py +16 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_envelope_sign_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_template_list_body.py +52 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200.py +62 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item.py +174 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_documents_item.py +50 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_owner.py +79 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_recipients_item.py +42 -0
- subnoto_api_client/generated/models/post_public_template_list_response_200_templates_item_status.py +11 -0
- subnoto_api_client/generated/models/post_public_template_list_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_template_list_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_template_list_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_template_list_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_template_list_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_template_list_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_template_list_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_template_list_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_template_list_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_body.py +46 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_200.py +74 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_utils_whoami_response_500_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_workspace_list_body.py +46 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_200.py +64 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_200_workspaces_item.py +74 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_401.py +84 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_401_error.py +70 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_401_error_code.py +10 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_403.py +84 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_403_error.py +70 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_403_error_code.py +9 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_500.py +84 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_500_error.py +70 -0
- subnoto_api_client/generated/models/post_public_workspace_list_response_500_error_code.py +9 -0
- subnoto_api_client/generated/types.py +54 -0
- subnoto_api_client/middleware/__init__.py +15 -0
- subnoto_api_client/middleware/signature_utils.py +128 -0
- subnoto_api_client/middleware/tunnel.py +119 -0
- subnoto_api_client/session.py +239 -0
- subnoto_api_client/transport.py +156 -0
- subnoto_api_client/types.py +43 -0
- subnoto_api_client-0.0.99.dist-info/METADATA +81 -0
- subnoto_api_client-0.0.99.dist-info/RECORD +399 -0
- subnoto_api_client-0.0.99.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,81 @@
|
|
|
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: 0.0.99
|
|
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
|
+
## Usage
|
|
42
|
+
|
|
43
|
+
### Basic Example
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
import asyncio
|
|
47
|
+
from subnoto_api_client import SubnotoClient, SubnotoConfig
|
|
48
|
+
|
|
49
|
+
async def main():
|
|
50
|
+
# Create client with configuration
|
|
51
|
+
config = SubnotoConfig(
|
|
52
|
+
api_base_url="https://enclave.subnoto.com",
|
|
53
|
+
access_key="your-access-key",
|
|
54
|
+
secret_key="your-secret-key-hex"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
async with SubnotoClient(config) as client:
|
|
58
|
+
# List workspaces
|
|
59
|
+
response = await client.post("/public/workspace/list", json={})
|
|
60
|
+
workspaces = response.json()
|
|
61
|
+
print(f"Workspaces: {workspaces}")
|
|
62
|
+
|
|
63
|
+
# Get current user info
|
|
64
|
+
response = await client.post("/public/utils/whoami", json={})
|
|
65
|
+
user_info = response.json()
|
|
66
|
+
print(f"User: {user_info}")
|
|
67
|
+
|
|
68
|
+
if __name__ == "__main__":
|
|
69
|
+
asyncio.run(main())
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Configuration
|
|
73
|
+
|
|
74
|
+
| Option | Type | Required | Description |
|
|
75
|
+
| -------------- | ----- | -------- | ------------------------------------------------------ |
|
|
76
|
+
| `api_base_url` | str | Yes | API base URL (e.g., `https://enclave.subnoto.com`) |
|
|
77
|
+
| `access_key` | str | Yes | API access key from your team settings |
|
|
78
|
+
| `secret_key` | str | Yes | API secret key (hex-encoded) from your team settings |
|
|
79
|
+
| `unattested` | bool | No | Use unattested mode for development (default: `False`) |
|
|
80
|
+
| `attester_key` | bytes | No | Public key for attestation verification |
|
|
81
|
+
|