signedly 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. signedly/__init__.py +92 -0
  2. signedly/api/__init__.py +14 -0
  3. signedly/api/api_request_logs_api.py +686 -0
  4. signedly/api/authentication_api.py +603 -0
  5. signedly/api/bulk_sending_api.py +858 -0
  6. signedly/api/documents_api.py +2465 -0
  7. signedly/api/downloads_api.py +840 -0
  8. signedly/api/fields_api.py +2308 -0
  9. signedly/api/sending_api.py +890 -0
  10. signedly/api/signatories_api.py +1165 -0
  11. signedly/api/templates_api.py +1452 -0
  12. signedly/api/webhooks_api.py +2582 -0
  13. signedly/api_client.py +798 -0
  14. signedly/api_response.py +21 -0
  15. signedly/configuration.py +596 -0
  16. signedly/exceptions.py +200 -0
  17. signedly/helpers.py +89 -0
  18. signedly/models/__init__.py +66 -0
  19. signedly/models/create_bulk_send202_response.py +105 -0
  20. signedly/models/create_bulk_send_request.py +101 -0
  21. signedly/models/create_document_fields_request_inner.py +156 -0
  22. signedly/models/create_document_from_template200_response.py +101 -0
  23. signedly/models/create_document_from_template_request.py +115 -0
  24. signedly/models/create_document_from_template_request_recipients_inner.py +92 -0
  25. signedly/models/create_signatories_request.py +100 -0
  26. signedly/models/create_signatories_request_signatories_inner.py +92 -0
  27. signedly/models/create_signatory_request.py +94 -0
  28. signedly/models/create_template_fields_request_inner.py +156 -0
  29. signedly/models/create_webhook_endpoint_request.py +103 -0
  30. signedly/models/delete_field_request.py +88 -0
  31. signedly/models/document.py +159 -0
  32. signedly/models/document_page.py +113 -0
  33. signedly/models/document_status_page.py +113 -0
  34. signedly/models/document_status_row.py +90 -0
  35. signedly/models/fill_and_send_document_request.py +116 -0
  36. signedly/models/fill_and_send_document_request_elements_inner.py +96 -0
  37. signedly/models/get_access_token_request.py +90 -0
  38. signedly/models/get_audit_trail_link200_response.py +88 -0
  39. signedly/models/get_download_status200_response.py +90 -0
  40. signedly/models/list_bulk_send_columns200_response_inner.py +92 -0
  41. signedly/models/model_field.py +202 -0
  42. signedly/models/page.py +102 -0
  43. signedly/models/refresh_access_token200_response.py +99 -0
  44. signedly/models/refresh_access_token_request.py +88 -0
  45. signedly/models/request_count_page.py +113 -0
  46. signedly/models/request_hit.py +93 -0
  47. signedly/models/request_log.py +108 -0
  48. signedly/models/request_log_page.py +113 -0
  49. signedly/models/send_document200_response.py +88 -0
  50. signedly/models/send_document_by_link200_response.py +90 -0
  51. signedly/models/send_document_by_link_request.py +91 -0
  52. signedly/models/send_document_request.py +102 -0
  53. signedly/models/signatory.py +119 -0
  54. signedly/models/template.py +124 -0
  55. signedly/models/template_field.py +202 -0
  56. signedly/models/template_page.py +113 -0
  57. signedly/models/update_document_field_by_body_request.py +158 -0
  58. signedly/models/update_document_field_by_body_request_items_inner.py +92 -0
  59. signedly/models/update_webhook_endpoint_request.py +105 -0
  60. signedly/models/upload.py +110 -0
  61. signedly/models/upload_document_for_one_signer200_response.py +90 -0
  62. signedly/models/upload_document_for_one_signer_request.py +96 -0
  63. signedly/models/upload_document_request.py +101 -0
  64. signedly/models/webhook_delivery.py +140 -0
  65. signedly/models/webhook_delivery_page.py +113 -0
  66. signedly/models/webhook_endpoint.py +116 -0
  67. signedly/models/webhook_endpoint_with_secret.py +120 -0
  68. signedly/py.typed +0 -0
  69. signedly/rest.py +258 -0
  70. signedly-0.1.0.dist-info/LICENSE +21 -0
  71. signedly-0.1.0.dist-info/METADATA +18 -0
  72. signedly-0.1.0.dist-info/RECORD +74 -0
  73. signedly-0.1.0.dist-info/WHEEL +5 -0
  74. signedly-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,840 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Signedly API
5
+
6
+ The Signedly REST API lets your system upload documents, add signatories and fields, send them for signing and download the signed result. Every path starts with `/ap1/`, and every request and response body is JSON unless an endpoint says otherwise (the uploads are `multipart/form-data`). ## Authentication 1. In the Signedly web app, open **Account & Settings → API** and generate a **client ID** and **client secret** for your organisation. 2. `POST /ap1/token/` with them. You get an `access_token` (valid **2 hours**) and a `refresh_token` (valid **7 days**). While both are still valid, calling `/ap1/token/` again returns the same pair. 3. Send the access token on every other call: `Authorization: Bearer <access_token>`. 4. When the access token expires, `POST /ap1/refreshtoken/` with the refresh token for a new access token. When the refresh token has expired too, call `/ap1/token/` again. `/ap1/token/` and `/ap1/refreshtoken/` allow 60 calls a minute per IP address; more answer 429. A missing, unknown or expired access token answers 403 (`\"Client not found\"` or `\"Access token expired\"`). The API acts for your **organisation's admin account**: documents you upload belong to it and appear in its Signedly web app, and you can reach only that account's documents, templates, signatories and fields. Another organisation's IDs answer 404, as if they didn't exist. ## Plans What the API allows depends on the Signedly plan of your **organisation's admin account** (Account & Settings → Account & Plan). The same rules apply to live and test keys. | What | Free | Personal Pro | Business Pro | Teams | |---|---|---|---|---| | Generate live and test keys (Account & Settings → API) | – | ✓ | ✓ | ✓ | | Every endpoint, `/ap1/token/` and `/ap1/refreshtoken/` included | – | ✓ | ✓ | ✓ | | `require_email_otp` on `POST /ap1/signatories/` and `POST /ap1/signatories/bulk/` | – | ✓ | ✓ | ✓ | | Bulk send: `GET /ap1/bulk-sends/columns/` and `POST /ap1/bulk-sends/` | – | – | – | ✓ | The API is part of the paid plans. On Free (or with no plan) every call answers 403 `\"... Your plan doesn't include API access.\"`, with live or test keys, also with a token or keys made earlier; they work again once the plan is paid. On a paid plan, a feature it doesn't include answers 400 with `\"Your plan doesn't include ...\"` and changes nothing, and `GET /ap1/bulk-sends/{id}/` still reports bulk sends already made. Live documents also need an API contract with Signedly. Without one, or with an unpaid API invoice, `POST /ap1/upload/` (except templates), `/ap1/upload_app/`, `/ap1/documents/fromtemplate/` and `/ap1/bulk-sends/` answer 402 with live keys. Test keys work without a contract (see Sandbox). ## Sending a document for signing 1. `POST /ap1/upload/` a PDF or DOCX (`type` 2). The document is prepared in the background: find it in `GET /ap1/documents/?name=<name>` (its `upload.id` is the upload's `id`), and wait until `GET /ap1/documents/{id}/pages/` lists its pages. 2. `POST /ap1/signatories/` (one) or `POST /ap1/signatories/bulk/` (several) to add the people who sign. 3. `POST /ap1/documents/fields/` to place the fields each signatory fills in. 4. Send it: - `POST /ap1/document/send/` emails every signatory a signing link (with ordered signing, only the first; each next one is emailed in turn), or - `POST /ap1/document/send_url/` sends no email and returns the first signatory's signing link, for you to show or send yourself. 5. Poll `GET /ap1/documents-status-list/` (or `GET /ap1/documents/`) until the status is 6 (Completed), then `GET /ap1/document/download-link/` for the signed PDF and `GET /ap1/document/download-audit-link/` for its audit trail. **From a template:** upload with `type` 4 and a `template_name` (or make the template in the web app), place its fields with `POST /ap1/templates/fields/`, then for each signing make a document with `POST /ap1/documents/fromtemplate/`, add its signatory, and send it. **One signer, one call:** `POST /ap1/upload_app/` uploads a PDF or DOCX for one signer and returns their signing link in `redirect_url`; the signer places their own signature. After signing they go to the `redirect_url` you sent, and the signed PDF and its audit trail are emailed to `final_email` (otherwise to your organisation's admin). ## Quick start with curl Each step uses an ID from the step before. `$API` is this server, e.g. `https://l0ads.signedly.com`. ```bash # 1. Token curl -X POST $API/ap1/token/ -H 'Content-Type: application/json' \\ -d '{\"client_id\": \"<client id>\", \"client_secret\": \"<client secret>\"}' TOKEN=<access_token from the answer> # 2. Upload a PDF (answers with the upload's id) curl -X POST $API/ap1/upload/ -H \"Authorization: Bearer $TOKEN\" \\ -F file=@nda.pdf -F name=nda-ann-lee -F type=2 # 3. Find the document, then wait until it has pages curl \"$API/ap1/documents/?name=nda-ann-lee\" -H \"Authorization: Bearer $TOKEN\" DOC=<results[0].id> curl $API/ap1/documents/$DOC/pages/ -H \"Authorization: Bearer $TOKEN\" PAGE=<[0].id> # 4. Add the signatory curl -X POST $API/ap1/signatories/ -H \"Authorization: Bearer $TOKEN\" \\ -H 'Content-Type: application/json' \\ -d '{\"document_id\": \"'$DOC'\", \"name\": \"Ann Lee\", \"email\": \"ann@example.com\"}' SIGNER=<id from the answer> # 5. Place her signature: 150 × 40 points, 72 points from the left, 640 from the top curl -X POST $API/ap1/documents/fields/ -H \"Authorization: Bearer $TOKEN\" \\ -H 'Content-Type: application/json' \\ -d '[{\"document_id\": \"'$DOC'\", \"signatory_id\": \"'$SIGNER'\", \"kind\": 2, \"label\": \"Signature\", \"placeholder\": \"Sign here\", \"page\": \"'$PAGE'\", \"page_number\": 0, \"x\": 72, \"y\": 640, \"width\": 150, \"height\": 40}]' # 6. Send it (Ann gets the signing email) curl -X POST $API/ap1/document/send/ -H \"Authorization: Bearer $TOKEN\" \\ -H 'Content-Type: application/json' \\ -d '{\"document_id\": \"'$DOC'\", \"subject\": \"Please sign the NDA\", \"message\": \"Hi Ann, please sign by Friday.\", \"expiry_date\": \"2026-12-31\"}' # 7. Poll until status is 6 (Completed), then get the signed PDF curl \"$API/ap1/documents-status-list/?document_ids=$DOC\" -H \"Authorization: Bearer $TOKEN\" curl \"$API/ap1/document/download-link/?id=$DOC\" -H \"Authorization: Bearer $TOKEN\" ``` ## Postman Import the whole API into Postman with **Import → Link** and `<this server>/swaggerap1/postman.json`. Set `client_id` and `client_secret` in the collection's **Variables**, run **Get an access token** (it saves the token for every other request), and set `document_id` when a request needs one. ## Webhooks Instead of polling, add an endpoint with `POST /ap1/webhooks/` (or in **Account & Settings → API**) and Signedly posts your organisation's document events to it: `document.sent`, `document.viewed`, `document.signed`, `document.approved`, `document.completed`, `document.rejected` and `document.expired` (all of them, or the `events` you choose). Each is a JSON `POST`: ```json {\"id\": \"5b7f…\", \"type\": \"document.signed\", \"created_at\": \"2026-10-27T09:12:00+00:00\", \"test\": false, \"data\": {\"document\": {\"id\": \"6f0c…\", \"name\": \"nda.pdf\", \"status\": 5}, \"recipient\": {\"id\": \"0b6e…\", \"email\": \"ann@example.com\", \"name\": \"Ann Lee\", \"role\": \"signer\"}}} ``` `recipient` is null for events no recipient caused (sent, completed, expired); `test` is true for documents made with your test keys. Fetch anything else, such as download links, with your access token: events never carry links. **Check every event is from Signedly.** The `Signedly-Signature` header is `t=<unix seconds>,v1=<signature>`, where the signature is the hex HMAC-SHA256 of `<t>.<raw body>` with the endpoint's secret. Refuse an event whose signature doesn't match or whose `t` is more than 5 minutes off: ```python import hashlib, hmac, time def is_from_signedly(secret, header, raw_body): parts = dict(item.split(\"=\", 1) for item in header.split(\",\")) signed = f\"{parts['t']}.{raw_body.decode()}\".encode() expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest() fresh = abs(time.time() - int(parts[\"t\"])) <= 300 return fresh and hmac.compare_digest(parts[\"v1\"], expected) ``` **Answer 2xx within 10 seconds**, then do the work. Anything else is retried after 1 and 5 minutes, then 30 minutes and 2, 5 and 10 hours (7 tries in about 18 hours). `Signedly-Event-Id` is the same on every try of an event: use it to ignore repeats. After 20 events in a row fail for good, Signedly switches the endpoint off and emails your organisation's admin; switch it on again with `PUT /ap1/webhooks/{id}/` and `\"is_active\": true`. Each endpoint's deliveries and their last answers are at `GET /ap1/webhooks/{id}/deliveries/`, and any can be sent again. ## Sandbox Build and test against the API without paying for documents: in **Account & Settings → API**, generate your **test keys**, and get a token with them at `/ap1/token/` as usual. Everything works the same, except that what you upload or make from a template with a test token is a **test document** (`is_test` on its upload): - every page of its PDF and of its audit trail says **TEST – NOT LEGALLY BINDING**; - its emails are real, with `[TEST]` at the start of the subject; - it isn't billed or counted toward your plan; - your organisation can make 50 a calendar month (templates don't count); the next upload answers 429. ## Fields Positions and sizes are in **PDF points** (1/72 inch), measured from the **top-left corner** of the page as it is displayed (rotation applied). `page_number` counts pages from 0. A field must sit wholly on its page (1 point of tolerance); otherwise it is refused with 400. A field's page and signatory can't be changed later: delete the field and add it again. ## Status values **Document `status`:** 1 Draft · 2 Signees Added · 3 Prepared · 4 Sent · 5 In Progress · 6 Completed · 7 Rejected · 8 Archived · 9 Expired. Signatories, fields and sends are only accepted while a document is 1–3 (not yet sent). **Signatory `status`:** 1 Waiting · 2 Invited · 3 Signed · 4 Viewed · 5 Rejected. ## Lists `GET /ap1/documents/`, `/ap1/documents-status-list/`, `/ap1/templates/`, `/ap1/logs/` and `/ap1/logs/hits/` are paged: pass `limit` (default 10) and `offset`, and read `count`, `next`, `previous` and `results` from the response. ## Errors | Status | Meaning | |---|---| | 400 | The request was refused, also when your plan doesn't include it (see Plans); the body says why (`{\"error\": \"...\"}`, or the name of each bad field with its messages). Nothing was changed. | | 403 | The access token is missing, unknown or expired; the client ID and secret or the refresh token were refused; the organisation's plan has no API access (Free, see Plans); or an `expiry_date` isn't in the future (`\"Invalid Date Entered\"`). | | 402 | No API contract, or an unpaid API invoice: live documents are refused (test keys keep working). | | 404 | The document, template, signatory or field doesn't exist or isn't yours. | | 429 | Too many token requests (wait a minute), or this month's 50 test documents are used. | | 5xx | Our side failed; retry later. | A send that times out may still have worked: check the document's status before sending again (a second send of a sent document answers 400). Download, view and audit links are valid for about 7 days; ask for a new one whenever you need it.
7
+
8
+ The version of the OpenAPI document: v1
9
+ Contact: info@signedly.com
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+ import warnings
16
+ from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
17
+ from typing import Any, Dict, List, Optional, Tuple, Union
18
+ from typing_extensions import Annotated
19
+
20
+ from pydantic import Field, StrictStr
21
+ from typing_extensions import Annotated
22
+ from signedly.models.get_audit_trail_link200_response import GetAuditTrailLink200Response
23
+
24
+ from signedly.api_client import ApiClient, RequestSerialized
25
+ from signedly.api_response import ApiResponse
26
+ from signedly.rest import RESTResponseType
27
+
28
+
29
+ class DownloadsApi:
30
+ """NOTE: This class is auto generated by OpenAPI Generator
31
+ Ref: https://openapi-generator.tech
32
+
33
+ Do not edit the class manually.
34
+ """
35
+
36
+ def __init__(self, api_client=None) -> None:
37
+ if api_client is None:
38
+ api_client = ApiClient.get_default()
39
+ self.api_client = api_client
40
+
41
+
42
+ @validate_call
43
+ def get_audit_trail_link(
44
+ self,
45
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
46
+ _request_timeout: Union[
47
+ None,
48
+ Annotated[StrictFloat, Field(gt=0)],
49
+ Tuple[
50
+ Annotated[StrictFloat, Field(gt=0)],
51
+ Annotated[StrictFloat, Field(gt=0)]
52
+ ]
53
+ ] = None,
54
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
55
+ _content_type: Optional[StrictStr] = None,
56
+ _headers: Optional[Dict[StrictStr, Any]] = None,
57
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
58
+ ) -> GetAuditTrailLink200Response:
59
+ """Get a link to the audit trail
60
+
61
+ A link to the document's audit trail PDF: who did what, when and from where. It is made when the document is completed; ask for it after GET /ap1/document/download-link/ gives the signed PDF.
62
+
63
+ :param id: The document's ID. (required)
64
+ :type id: str
65
+ :param _request_timeout: timeout setting for this request. If one
66
+ number provided, it will be total request
67
+ timeout. It can also be a pair (tuple) of
68
+ (connection, read) timeouts.
69
+ :type _request_timeout: int, tuple(int, int), optional
70
+ :param _request_auth: set to override the auth_settings for an a single
71
+ request; this effectively ignores the
72
+ authentication in the spec for a single request.
73
+ :type _request_auth: dict, optional
74
+ :param _content_type: force content-type for the request.
75
+ :type _content_type: str, Optional
76
+ :param _headers: set to override the headers for a single
77
+ request; this effectively ignores the headers
78
+ in the spec for a single request.
79
+ :type _headers: dict, optional
80
+ :param _host_index: set to override the host_index for a single
81
+ request; this effectively ignores the host_index
82
+ in the spec for a single request.
83
+ :type _host_index: int, optional
84
+ :return: Returns the result object.
85
+ """ # noqa: E501
86
+
87
+ _param = self._get_audit_trail_link_serialize(
88
+ id=id,
89
+ _request_auth=_request_auth,
90
+ _content_type=_content_type,
91
+ _headers=_headers,
92
+ _host_index=_host_index
93
+ )
94
+
95
+ _response_types_map: Dict[str, Optional[str]] = {
96
+ '200': "GetAuditTrailLink200Response",
97
+ '404': "Dict[str, object]",
98
+ }
99
+ response_data = self.api_client.call_api(
100
+ *_param,
101
+ _request_timeout=_request_timeout
102
+ )
103
+ response_data.read()
104
+ return self.api_client.response_deserialize(
105
+ response_data=response_data,
106
+ response_types_map=_response_types_map,
107
+ ).data
108
+
109
+
110
+ @validate_call
111
+ def get_audit_trail_link_with_http_info(
112
+ self,
113
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
114
+ _request_timeout: Union[
115
+ None,
116
+ Annotated[StrictFloat, Field(gt=0)],
117
+ Tuple[
118
+ Annotated[StrictFloat, Field(gt=0)],
119
+ Annotated[StrictFloat, Field(gt=0)]
120
+ ]
121
+ ] = None,
122
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
123
+ _content_type: Optional[StrictStr] = None,
124
+ _headers: Optional[Dict[StrictStr, Any]] = None,
125
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
126
+ ) -> ApiResponse[GetAuditTrailLink200Response]:
127
+ """Get a link to the audit trail
128
+
129
+ A link to the document's audit trail PDF: who did what, when and from where. It is made when the document is completed; ask for it after GET /ap1/document/download-link/ gives the signed PDF.
130
+
131
+ :param id: The document's ID. (required)
132
+ :type id: str
133
+ :param _request_timeout: timeout setting for this request. If one
134
+ number provided, it will be total request
135
+ timeout. It can also be a pair (tuple) of
136
+ (connection, read) timeouts.
137
+ :type _request_timeout: int, tuple(int, int), optional
138
+ :param _request_auth: set to override the auth_settings for an a single
139
+ request; this effectively ignores the
140
+ authentication in the spec for a single request.
141
+ :type _request_auth: dict, optional
142
+ :param _content_type: force content-type for the request.
143
+ :type _content_type: str, Optional
144
+ :param _headers: set to override the headers for a single
145
+ request; this effectively ignores the headers
146
+ in the spec for a single request.
147
+ :type _headers: dict, optional
148
+ :param _host_index: set to override the host_index for a single
149
+ request; this effectively ignores the host_index
150
+ in the spec for a single request.
151
+ :type _host_index: int, optional
152
+ :return: Returns the result object.
153
+ """ # noqa: E501
154
+
155
+ _param = self._get_audit_trail_link_serialize(
156
+ id=id,
157
+ _request_auth=_request_auth,
158
+ _content_type=_content_type,
159
+ _headers=_headers,
160
+ _host_index=_host_index
161
+ )
162
+
163
+ _response_types_map: Dict[str, Optional[str]] = {
164
+ '200': "GetAuditTrailLink200Response",
165
+ '404': "Dict[str, object]",
166
+ }
167
+ response_data = self.api_client.call_api(
168
+ *_param,
169
+ _request_timeout=_request_timeout
170
+ )
171
+ response_data.read()
172
+ return self.api_client.response_deserialize(
173
+ response_data=response_data,
174
+ response_types_map=_response_types_map,
175
+ )
176
+
177
+
178
+ @validate_call
179
+ def get_audit_trail_link_without_preload_content(
180
+ self,
181
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
182
+ _request_timeout: Union[
183
+ None,
184
+ Annotated[StrictFloat, Field(gt=0)],
185
+ Tuple[
186
+ Annotated[StrictFloat, Field(gt=0)],
187
+ Annotated[StrictFloat, Field(gt=0)]
188
+ ]
189
+ ] = None,
190
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
191
+ _content_type: Optional[StrictStr] = None,
192
+ _headers: Optional[Dict[StrictStr, Any]] = None,
193
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
194
+ ) -> RESTResponseType:
195
+ """Get a link to the audit trail
196
+
197
+ A link to the document's audit trail PDF: who did what, when and from where. It is made when the document is completed; ask for it after GET /ap1/document/download-link/ gives the signed PDF.
198
+
199
+ :param id: The document's ID. (required)
200
+ :type id: str
201
+ :param _request_timeout: timeout setting for this request. If one
202
+ number provided, it will be total request
203
+ timeout. It can also be a pair (tuple) of
204
+ (connection, read) timeouts.
205
+ :type _request_timeout: int, tuple(int, int), optional
206
+ :param _request_auth: set to override the auth_settings for an a single
207
+ request; this effectively ignores the
208
+ authentication in the spec for a single request.
209
+ :type _request_auth: dict, optional
210
+ :param _content_type: force content-type for the request.
211
+ :type _content_type: str, Optional
212
+ :param _headers: set to override the headers for a single
213
+ request; this effectively ignores the headers
214
+ in the spec for a single request.
215
+ :type _headers: dict, optional
216
+ :param _host_index: set to override the host_index for a single
217
+ request; this effectively ignores the host_index
218
+ in the spec for a single request.
219
+ :type _host_index: int, optional
220
+ :return: Returns the result object.
221
+ """ # noqa: E501
222
+
223
+ _param = self._get_audit_trail_link_serialize(
224
+ id=id,
225
+ _request_auth=_request_auth,
226
+ _content_type=_content_type,
227
+ _headers=_headers,
228
+ _host_index=_host_index
229
+ )
230
+
231
+ _response_types_map: Dict[str, Optional[str]] = {
232
+ '200': "GetAuditTrailLink200Response",
233
+ '404': "Dict[str, object]",
234
+ }
235
+ response_data = self.api_client.call_api(
236
+ *_param,
237
+ _request_timeout=_request_timeout
238
+ )
239
+ return response_data.response
240
+
241
+
242
+ def _get_audit_trail_link_serialize(
243
+ self,
244
+ id,
245
+ _request_auth,
246
+ _content_type,
247
+ _headers,
248
+ _host_index,
249
+ ) -> RequestSerialized:
250
+
251
+ _host = None
252
+
253
+ _collection_formats: Dict[str, str] = {
254
+ }
255
+
256
+ _path_params: Dict[str, str] = {}
257
+ _query_params: List[Tuple[str, str]] = []
258
+ _header_params: Dict[str, Optional[str]] = _headers or {}
259
+ _form_params: List[Tuple[str, str]] = []
260
+ _files: Dict[
261
+ str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
262
+ ] = {}
263
+ _body_params: Optional[bytes] = None
264
+
265
+ # process the path parameters
266
+ # process the query parameters
267
+ if id is not None:
268
+
269
+ _query_params.append(('id', id))
270
+
271
+ # process the header parameters
272
+ # process the form parameters
273
+ # process the body parameter
274
+
275
+
276
+ # set the HTTP header `Accept`
277
+ if 'Accept' not in _header_params:
278
+ _header_params['Accept'] = self.api_client.select_header_accept(
279
+ [
280
+ 'application/json'
281
+ ]
282
+ )
283
+
284
+
285
+ # authentication setting
286
+ _auth_settings: List[str] = [
287
+ 'Bearer'
288
+ ]
289
+
290
+ return self.api_client.param_serialize(
291
+ method='GET',
292
+ resource_path='/ap1/document/download-audit-link/',
293
+ path_params=_path_params,
294
+ query_params=_query_params,
295
+ header_params=_header_params,
296
+ body=_body_params,
297
+ post_params=_form_params,
298
+ files=_files,
299
+ auth_settings=_auth_settings,
300
+ collection_formats=_collection_formats,
301
+ _host=_host,
302
+ _request_auth=_request_auth
303
+ )
304
+
305
+
306
+
307
+
308
+ @validate_call
309
+ def get_download_link(
310
+ self,
311
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
312
+ _request_timeout: Union[
313
+ None,
314
+ Annotated[StrictFloat, Field(gt=0)],
315
+ Tuple[
316
+ Annotated[StrictFloat, Field(gt=0)],
317
+ Annotated[StrictFloat, Field(gt=0)]
318
+ ]
319
+ ] = None,
320
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
321
+ _content_type: Optional[StrictStr] = None,
322
+ _headers: Optional[Dict[StrictStr, Any]] = None,
323
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
324
+ ) -> GetAuditTrailLink200Response:
325
+ """Get a link to the signed PDF
326
+
327
+ A link to the final signed PDF, once every signatory has signed and it has been sealed. Until then the answer is 202: try again later.
328
+
329
+ :param id: The document's ID. (required)
330
+ :type id: str
331
+ :param _request_timeout: timeout setting for this request. If one
332
+ number provided, it will be total request
333
+ timeout. It can also be a pair (tuple) of
334
+ (connection, read) timeouts.
335
+ :type _request_timeout: int, tuple(int, int), optional
336
+ :param _request_auth: set to override the auth_settings for an a single
337
+ request; this effectively ignores the
338
+ authentication in the spec for a single request.
339
+ :type _request_auth: dict, optional
340
+ :param _content_type: force content-type for the request.
341
+ :type _content_type: str, Optional
342
+ :param _headers: set to override the headers for a single
343
+ request; this effectively ignores the headers
344
+ in the spec for a single request.
345
+ :type _headers: dict, optional
346
+ :param _host_index: set to override the host_index for a single
347
+ request; this effectively ignores the host_index
348
+ in the spec for a single request.
349
+ :type _host_index: int, optional
350
+ :return: Returns the result object.
351
+ """ # noqa: E501
352
+
353
+ _param = self._get_download_link_serialize(
354
+ id=id,
355
+ _request_auth=_request_auth,
356
+ _content_type=_content_type,
357
+ _headers=_headers,
358
+ _host_index=_host_index
359
+ )
360
+
361
+ _response_types_map: Dict[str, Optional[str]] = {
362
+ '200': "GetAuditTrailLink200Response",
363
+ '202': "Dict[str, object]",
364
+ '404': "Dict[str, object]",
365
+ }
366
+ response_data = self.api_client.call_api(
367
+ *_param,
368
+ _request_timeout=_request_timeout
369
+ )
370
+ response_data.read()
371
+ return self.api_client.response_deserialize(
372
+ response_data=response_data,
373
+ response_types_map=_response_types_map,
374
+ ).data
375
+
376
+
377
+ @validate_call
378
+ def get_download_link_with_http_info(
379
+ self,
380
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
381
+ _request_timeout: Union[
382
+ None,
383
+ Annotated[StrictFloat, Field(gt=0)],
384
+ Tuple[
385
+ Annotated[StrictFloat, Field(gt=0)],
386
+ Annotated[StrictFloat, Field(gt=0)]
387
+ ]
388
+ ] = None,
389
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
390
+ _content_type: Optional[StrictStr] = None,
391
+ _headers: Optional[Dict[StrictStr, Any]] = None,
392
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
393
+ ) -> ApiResponse[GetAuditTrailLink200Response]:
394
+ """Get a link to the signed PDF
395
+
396
+ A link to the final signed PDF, once every signatory has signed and it has been sealed. Until then the answer is 202: try again later.
397
+
398
+ :param id: The document's ID. (required)
399
+ :type id: str
400
+ :param _request_timeout: timeout setting for this request. If one
401
+ number provided, it will be total request
402
+ timeout. It can also be a pair (tuple) of
403
+ (connection, read) timeouts.
404
+ :type _request_timeout: int, tuple(int, int), optional
405
+ :param _request_auth: set to override the auth_settings for an a single
406
+ request; this effectively ignores the
407
+ authentication in the spec for a single request.
408
+ :type _request_auth: dict, optional
409
+ :param _content_type: force content-type for the request.
410
+ :type _content_type: str, Optional
411
+ :param _headers: set to override the headers for a single
412
+ request; this effectively ignores the headers
413
+ in the spec for a single request.
414
+ :type _headers: dict, optional
415
+ :param _host_index: set to override the host_index for a single
416
+ request; this effectively ignores the host_index
417
+ in the spec for a single request.
418
+ :type _host_index: int, optional
419
+ :return: Returns the result object.
420
+ """ # noqa: E501
421
+
422
+ _param = self._get_download_link_serialize(
423
+ id=id,
424
+ _request_auth=_request_auth,
425
+ _content_type=_content_type,
426
+ _headers=_headers,
427
+ _host_index=_host_index
428
+ )
429
+
430
+ _response_types_map: Dict[str, Optional[str]] = {
431
+ '200': "GetAuditTrailLink200Response",
432
+ '202': "Dict[str, object]",
433
+ '404': "Dict[str, object]",
434
+ }
435
+ response_data = self.api_client.call_api(
436
+ *_param,
437
+ _request_timeout=_request_timeout
438
+ )
439
+ response_data.read()
440
+ return self.api_client.response_deserialize(
441
+ response_data=response_data,
442
+ response_types_map=_response_types_map,
443
+ )
444
+
445
+
446
+ @validate_call
447
+ def get_download_link_without_preload_content(
448
+ self,
449
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
450
+ _request_timeout: Union[
451
+ None,
452
+ Annotated[StrictFloat, Field(gt=0)],
453
+ Tuple[
454
+ Annotated[StrictFloat, Field(gt=0)],
455
+ Annotated[StrictFloat, Field(gt=0)]
456
+ ]
457
+ ] = None,
458
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
459
+ _content_type: Optional[StrictStr] = None,
460
+ _headers: Optional[Dict[StrictStr, Any]] = None,
461
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
462
+ ) -> RESTResponseType:
463
+ """Get a link to the signed PDF
464
+
465
+ A link to the final signed PDF, once every signatory has signed and it has been sealed. Until then the answer is 202: try again later.
466
+
467
+ :param id: The document's ID. (required)
468
+ :type id: str
469
+ :param _request_timeout: timeout setting for this request. If one
470
+ number provided, it will be total request
471
+ timeout. It can also be a pair (tuple) of
472
+ (connection, read) timeouts.
473
+ :type _request_timeout: int, tuple(int, int), optional
474
+ :param _request_auth: set to override the auth_settings for an a single
475
+ request; this effectively ignores the
476
+ authentication in the spec for a single request.
477
+ :type _request_auth: dict, optional
478
+ :param _content_type: force content-type for the request.
479
+ :type _content_type: str, Optional
480
+ :param _headers: set to override the headers for a single
481
+ request; this effectively ignores the headers
482
+ in the spec for a single request.
483
+ :type _headers: dict, optional
484
+ :param _host_index: set to override the host_index for a single
485
+ request; this effectively ignores the host_index
486
+ in the spec for a single request.
487
+ :type _host_index: int, optional
488
+ :return: Returns the result object.
489
+ """ # noqa: E501
490
+
491
+ _param = self._get_download_link_serialize(
492
+ id=id,
493
+ _request_auth=_request_auth,
494
+ _content_type=_content_type,
495
+ _headers=_headers,
496
+ _host_index=_host_index
497
+ )
498
+
499
+ _response_types_map: Dict[str, Optional[str]] = {
500
+ '200': "GetAuditTrailLink200Response",
501
+ '202': "Dict[str, object]",
502
+ '404': "Dict[str, object]",
503
+ }
504
+ response_data = self.api_client.call_api(
505
+ *_param,
506
+ _request_timeout=_request_timeout
507
+ )
508
+ return response_data.response
509
+
510
+
511
+ def _get_download_link_serialize(
512
+ self,
513
+ id,
514
+ _request_auth,
515
+ _content_type,
516
+ _headers,
517
+ _host_index,
518
+ ) -> RequestSerialized:
519
+
520
+ _host = None
521
+
522
+ _collection_formats: Dict[str, str] = {
523
+ }
524
+
525
+ _path_params: Dict[str, str] = {}
526
+ _query_params: List[Tuple[str, str]] = []
527
+ _header_params: Dict[str, Optional[str]] = _headers or {}
528
+ _form_params: List[Tuple[str, str]] = []
529
+ _files: Dict[
530
+ str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
531
+ ] = {}
532
+ _body_params: Optional[bytes] = None
533
+
534
+ # process the path parameters
535
+ # process the query parameters
536
+ if id is not None:
537
+
538
+ _query_params.append(('id', id))
539
+
540
+ # process the header parameters
541
+ # process the form parameters
542
+ # process the body parameter
543
+
544
+
545
+ # set the HTTP header `Accept`
546
+ if 'Accept' not in _header_params:
547
+ _header_params['Accept'] = self.api_client.select_header_accept(
548
+ [
549
+ 'application/json'
550
+ ]
551
+ )
552
+
553
+
554
+ # authentication setting
555
+ _auth_settings: List[str] = [
556
+ 'Bearer'
557
+ ]
558
+
559
+ return self.api_client.param_serialize(
560
+ method='GET',
561
+ resource_path='/ap1/document/download-link/',
562
+ path_params=_path_params,
563
+ query_params=_query_params,
564
+ header_params=_header_params,
565
+ body=_body_params,
566
+ post_params=_form_params,
567
+ files=_files,
568
+ auth_settings=_auth_settings,
569
+ collection_formats=_collection_formats,
570
+ _host=_host,
571
+ _request_auth=_request_auth
572
+ )
573
+
574
+
575
+
576
+
577
+ @validate_call
578
+ def get_view_link(
579
+ self,
580
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
581
+ _request_timeout: Union[
582
+ None,
583
+ Annotated[StrictFloat, Field(gt=0)],
584
+ Tuple[
585
+ Annotated[StrictFloat, Field(gt=0)],
586
+ Annotated[StrictFloat, Field(gt=0)]
587
+ ]
588
+ ] = None,
589
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
590
+ _content_type: Optional[StrictStr] = None,
591
+ _headers: Optional[Dict[StrictStr, Any]] = None,
592
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
593
+ ) -> GetAuditTrailLink200Response:
594
+ """Get a link to view the document
595
+
596
+ A link to the document's PDF as it stands now, with the values and signatures applied so far. For the final signed PDF, use GET /ap1/document/download-link/.
597
+
598
+ :param id: The document's ID. (required)
599
+ :type id: str
600
+ :param _request_timeout: timeout setting for this request. If one
601
+ number provided, it will be total request
602
+ timeout. It can also be a pair (tuple) of
603
+ (connection, read) timeouts.
604
+ :type _request_timeout: int, tuple(int, int), optional
605
+ :param _request_auth: set to override the auth_settings for an a single
606
+ request; this effectively ignores the
607
+ authentication in the spec for a single request.
608
+ :type _request_auth: dict, optional
609
+ :param _content_type: force content-type for the request.
610
+ :type _content_type: str, Optional
611
+ :param _headers: set to override the headers for a single
612
+ request; this effectively ignores the headers
613
+ in the spec for a single request.
614
+ :type _headers: dict, optional
615
+ :param _host_index: set to override the host_index for a single
616
+ request; this effectively ignores the host_index
617
+ in the spec for a single request.
618
+ :type _host_index: int, optional
619
+ :return: Returns the result object.
620
+ """ # noqa: E501
621
+
622
+ _param = self._get_view_link_serialize(
623
+ id=id,
624
+ _request_auth=_request_auth,
625
+ _content_type=_content_type,
626
+ _headers=_headers,
627
+ _host_index=_host_index
628
+ )
629
+
630
+ _response_types_map: Dict[str, Optional[str]] = {
631
+ '200': "GetAuditTrailLink200Response",
632
+ '404': "Dict[str, object]",
633
+ }
634
+ response_data = self.api_client.call_api(
635
+ *_param,
636
+ _request_timeout=_request_timeout
637
+ )
638
+ response_data.read()
639
+ return self.api_client.response_deserialize(
640
+ response_data=response_data,
641
+ response_types_map=_response_types_map,
642
+ ).data
643
+
644
+
645
+ @validate_call
646
+ def get_view_link_with_http_info(
647
+ self,
648
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
649
+ _request_timeout: Union[
650
+ None,
651
+ Annotated[StrictFloat, Field(gt=0)],
652
+ Tuple[
653
+ Annotated[StrictFloat, Field(gt=0)],
654
+ Annotated[StrictFloat, Field(gt=0)]
655
+ ]
656
+ ] = None,
657
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
658
+ _content_type: Optional[StrictStr] = None,
659
+ _headers: Optional[Dict[StrictStr, Any]] = None,
660
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
661
+ ) -> ApiResponse[GetAuditTrailLink200Response]:
662
+ """Get a link to view the document
663
+
664
+ A link to the document's PDF as it stands now, with the values and signatures applied so far. For the final signed PDF, use GET /ap1/document/download-link/.
665
+
666
+ :param id: The document's ID. (required)
667
+ :type id: str
668
+ :param _request_timeout: timeout setting for this request. If one
669
+ number provided, it will be total request
670
+ timeout. It can also be a pair (tuple) of
671
+ (connection, read) timeouts.
672
+ :type _request_timeout: int, tuple(int, int), optional
673
+ :param _request_auth: set to override the auth_settings for an a single
674
+ request; this effectively ignores the
675
+ authentication in the spec for a single request.
676
+ :type _request_auth: dict, optional
677
+ :param _content_type: force content-type for the request.
678
+ :type _content_type: str, Optional
679
+ :param _headers: set to override the headers for a single
680
+ request; this effectively ignores the headers
681
+ in the spec for a single request.
682
+ :type _headers: dict, optional
683
+ :param _host_index: set to override the host_index for a single
684
+ request; this effectively ignores the host_index
685
+ in the spec for a single request.
686
+ :type _host_index: int, optional
687
+ :return: Returns the result object.
688
+ """ # noqa: E501
689
+
690
+ _param = self._get_view_link_serialize(
691
+ id=id,
692
+ _request_auth=_request_auth,
693
+ _content_type=_content_type,
694
+ _headers=_headers,
695
+ _host_index=_host_index
696
+ )
697
+
698
+ _response_types_map: Dict[str, Optional[str]] = {
699
+ '200': "GetAuditTrailLink200Response",
700
+ '404': "Dict[str, object]",
701
+ }
702
+ response_data = self.api_client.call_api(
703
+ *_param,
704
+ _request_timeout=_request_timeout
705
+ )
706
+ response_data.read()
707
+ return self.api_client.response_deserialize(
708
+ response_data=response_data,
709
+ response_types_map=_response_types_map,
710
+ )
711
+
712
+
713
+ @validate_call
714
+ def get_view_link_without_preload_content(
715
+ self,
716
+ id: Annotated[StrictStr, Field(description="The document's ID.")],
717
+ _request_timeout: Union[
718
+ None,
719
+ Annotated[StrictFloat, Field(gt=0)],
720
+ Tuple[
721
+ Annotated[StrictFloat, Field(gt=0)],
722
+ Annotated[StrictFloat, Field(gt=0)]
723
+ ]
724
+ ] = None,
725
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
726
+ _content_type: Optional[StrictStr] = None,
727
+ _headers: Optional[Dict[StrictStr, Any]] = None,
728
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
729
+ ) -> RESTResponseType:
730
+ """Get a link to view the document
731
+
732
+ A link to the document's PDF as it stands now, with the values and signatures applied so far. For the final signed PDF, use GET /ap1/document/download-link/.
733
+
734
+ :param id: The document's ID. (required)
735
+ :type id: str
736
+ :param _request_timeout: timeout setting for this request. If one
737
+ number provided, it will be total request
738
+ timeout. It can also be a pair (tuple) of
739
+ (connection, read) timeouts.
740
+ :type _request_timeout: int, tuple(int, int), optional
741
+ :param _request_auth: set to override the auth_settings for an a single
742
+ request; this effectively ignores the
743
+ authentication in the spec for a single request.
744
+ :type _request_auth: dict, optional
745
+ :param _content_type: force content-type for the request.
746
+ :type _content_type: str, Optional
747
+ :param _headers: set to override the headers for a single
748
+ request; this effectively ignores the headers
749
+ in the spec for a single request.
750
+ :type _headers: dict, optional
751
+ :param _host_index: set to override the host_index for a single
752
+ request; this effectively ignores the host_index
753
+ in the spec for a single request.
754
+ :type _host_index: int, optional
755
+ :return: Returns the result object.
756
+ """ # noqa: E501
757
+
758
+ _param = self._get_view_link_serialize(
759
+ id=id,
760
+ _request_auth=_request_auth,
761
+ _content_type=_content_type,
762
+ _headers=_headers,
763
+ _host_index=_host_index
764
+ )
765
+
766
+ _response_types_map: Dict[str, Optional[str]] = {
767
+ '200': "GetAuditTrailLink200Response",
768
+ '404': "Dict[str, object]",
769
+ }
770
+ response_data = self.api_client.call_api(
771
+ *_param,
772
+ _request_timeout=_request_timeout
773
+ )
774
+ return response_data.response
775
+
776
+
777
+ def _get_view_link_serialize(
778
+ self,
779
+ id,
780
+ _request_auth,
781
+ _content_type,
782
+ _headers,
783
+ _host_index,
784
+ ) -> RequestSerialized:
785
+
786
+ _host = None
787
+
788
+ _collection_formats: Dict[str, str] = {
789
+ }
790
+
791
+ _path_params: Dict[str, str] = {}
792
+ _query_params: List[Tuple[str, str]] = []
793
+ _header_params: Dict[str, Optional[str]] = _headers or {}
794
+ _form_params: List[Tuple[str, str]] = []
795
+ _files: Dict[
796
+ str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
797
+ ] = {}
798
+ _body_params: Optional[bytes] = None
799
+
800
+ # process the path parameters
801
+ # process the query parameters
802
+ if id is not None:
803
+
804
+ _query_params.append(('id', id))
805
+
806
+ # process the header parameters
807
+ # process the form parameters
808
+ # process the body parameter
809
+
810
+
811
+ # set the HTTP header `Accept`
812
+ if 'Accept' not in _header_params:
813
+ _header_params['Accept'] = self.api_client.select_header_accept(
814
+ [
815
+ 'application/json'
816
+ ]
817
+ )
818
+
819
+
820
+ # authentication setting
821
+ _auth_settings: List[str] = [
822
+ 'Bearer'
823
+ ]
824
+
825
+ return self.api_client.param_serialize(
826
+ method='GET',
827
+ resource_path='/ap1/document/view-link/',
828
+ path_params=_path_params,
829
+ query_params=_query_params,
830
+ header_params=_header_params,
831
+ body=_body_params,
832
+ post_params=_form_params,
833
+ files=_files,
834
+ auth_settings=_auth_settings,
835
+ collection_formats=_collection_formats,
836
+ _host=_host,
837
+ _request_auth=_request_auth
838
+ )
839
+
840
+