imzala 0.1.0__tar.gz

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 (117) hide show
  1. imzala-0.1.0/PKG-INFO +13 -0
  2. imzala-0.1.0/README.md +181 -0
  3. imzala-0.1.0/generated/imzala_client/__init__.py +221 -0
  4. imzala-0.1.0/generated/imzala_client/api/__init__.py +9 -0
  5. imzala-0.1.0/generated/imzala_client/api/account_api.py +288 -0
  6. imzala-0.1.0/generated/imzala_client/api/demands_api.py +3623 -0
  7. imzala-0.1.0/generated/imzala_client/api/reminders_api.py +345 -0
  8. imzala-0.1.0/generated/imzala_client/api/templates_api.py +1414 -0
  9. imzala-0.1.0/generated/imzala_client/api/timestamps_api.py +395 -0
  10. imzala-0.1.0/generated/imzala_client/api_client.py +805 -0
  11. imzala-0.1.0/generated/imzala_client/api_response.py +21 -0
  12. imzala-0.1.0/generated/imzala_client/configuration.py +631 -0
  13. imzala-0.1.0/generated/imzala_client/exceptions.py +219 -0
  14. imzala-0.1.0/generated/imzala_client/models/__init__.py +99 -0
  15. imzala-0.1.0/generated/imzala_client/models/api_error.py +93 -0
  16. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_get200_response.py +95 -0
  17. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_get200_response_data.py +103 -0
  18. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_get200_response_data_demands_inner.py +120 -0
  19. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_cancel_post200_response.py +95 -0
  20. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_cancel_post200_response_data.py +109 -0
  21. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_cancel_post_request.py +89 -0
  22. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_delete409_response.py +93 -0
  23. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_embed_session_post200_response.py +95 -0
  24. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_embed_session_post200_response_data.py +94 -0
  25. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_embed_session_post_request.py +90 -0
  26. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_get200_response.py +95 -0
  27. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_parties_party_id_resend_post200_response.py +95 -0
  28. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_parties_party_id_resend_post200_response_data.py +89 -0
  29. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post200_response.py +95 -0
  30. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post200_response_data.py +113 -0
  31. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post200_response_data_dispatched_inner.py +107 -0
  32. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post200_response_data_skipped_inner.py +92 -0
  33. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post429_response.py +95 -0
  34. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_reminders_post429_response_error.py +103 -0
  35. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_timeline_get200_response.py +95 -0
  36. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_timeline_get200_response_data.py +97 -0
  37. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_id_timeline_get200_response_data_events_inner.py +122 -0
  38. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_post201_response.py +95 -0
  39. imzala-0.1.0/generated/imzala_client/models/api_v1_demands_upload_post201_response.py +95 -0
  40. imzala-0.1.0/generated/imzala_client/models/api_v1_me_get200_response.py +95 -0
  41. imzala-0.1.0/generated/imzala_client/models/api_v1_me_get200_response_data.py +108 -0
  42. imzala-0.1.0/generated/imzala_client/models/api_v1_me_get200_response_data_credits.py +89 -0
  43. imzala-0.1.0/generated/imzala_client/models/api_v1_me_get200_response_data_workspace.py +107 -0
  44. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_get200_response.py +95 -0
  45. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_get200_response_data.py +103 -0
  46. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_get401_response.py +93 -0
  47. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_delete200_response.py +95 -0
  48. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_delete200_response_data.py +92 -0
  49. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_get200_response.py +95 -0
  50. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_get404_response.py +91 -0
  51. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_patch200_response.py +95 -0
  52. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_patch200_response_data.py +106 -0
  53. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_patch_request.py +93 -0
  54. imzala-0.1.0/generated/imzala_client/models/api_v1_templates_id_usage_get200_response.py +95 -0
  55. imzala-0.1.0/generated/imzala_client/models/api_v1_timestamps_post201_response.py +95 -0
  56. imzala-0.1.0/generated/imzala_client/models/api_v1_timestamps_post_request1.py +97 -0
  57. imzala-0.1.0/generated/imzala_client/models/create_demand_request.py +145 -0
  58. imzala-0.1.0/generated/imzala_client/models/created_demand.py +126 -0
  59. imzala-0.1.0/generated/imzala_client/models/created_demand_signing_urls_inner.py +110 -0
  60. imzala-0.1.0/generated/imzala_client/models/created_demand_upload.py +116 -0
  61. imzala-0.1.0/generated/imzala_client/models/demand_page.py +91 -0
  62. imzala-0.1.0/generated/imzala_client/models/demand_status.py +133 -0
  63. imzala-0.1.0/generated/imzala_client/models/demand_status_parties_inner.py +115 -0
  64. imzala-0.1.0/generated/imzala_client/models/page_item.py +151 -0
  65. imzala-0.1.0/generated/imzala_client/models/party_mapping_input.py +122 -0
  66. imzala-0.1.0/generated/imzala_client/models/party_mapping_input_variables_value.py +167 -0
  67. imzala-0.1.0/generated/imzala_client/models/reminder_settings.py +107 -0
  68. imzala-0.1.0/generated/imzala_client/models/standard_error.py +95 -0
  69. imzala-0.1.0/generated/imzala_client/models/standard_error_error.py +100 -0
  70. imzala-0.1.0/generated/imzala_client/models/template_detail.py +130 -0
  71. imzala-0.1.0/generated/imzala_client/models/template_party_summary.py +96 -0
  72. imzala-0.1.0/generated/imzala_client/models/template_summary.py +118 -0
  73. imzala-0.1.0/generated/imzala_client/models/template_summary_parties_inner.py +96 -0
  74. imzala-0.1.0/generated/imzala_client/models/template_usage.py +127 -0
  75. imzala-0.1.0/generated/imzala_client/models/template_usage_endpoint.py +91 -0
  76. imzala-0.1.0/generated/imzala_client/models/template_usage_example_request.py +91 -0
  77. imzala-0.1.0/generated/imzala_client/models/template_usage_parties_inner.py +106 -0
  78. imzala-0.1.0/generated/imzala_client/models/template_usage_parties_inner_supported_fields_inner.py +102 -0
  79. imzala-0.1.0/generated/imzala_client/models/template_usage_variables_inner.py +113 -0
  80. imzala-0.1.0/generated/imzala_client/models/template_variable.py +119 -0
  81. imzala-0.1.0/generated/imzala_client/models/timestamp_record.py +105 -0
  82. imzala-0.1.0/generated/imzala_client/models/trigger_reminder_request.py +102 -0
  83. imzala-0.1.0/generated/imzala_client/models/upsert_items_request.py +99 -0
  84. imzala-0.1.0/generated/imzala_client/models/upsert_items_response.py +95 -0
  85. imzala-0.1.0/generated/imzala_client/models/upsert_items_response_data.py +99 -0
  86. imzala-0.1.0/generated/imzala_client/models/upsert_items_response_data_items_inner.py +132 -0
  87. imzala-0.1.0/generated/imzala_client/models/webhook_data_demand_completed.py +116 -0
  88. imzala-0.1.0/generated/imzala_client/models/webhook_data_demand_completed_parties_inner.py +107 -0
  89. imzala-0.1.0/generated/imzala_client/models/webhook_data_demand_created.py +94 -0
  90. imzala-0.1.0/generated/imzala_client/models/webhook_data_demand_expired.py +105 -0
  91. imzala-0.1.0/generated/imzala_client/models/webhook_data_demand_expired_parties_inner.py +101 -0
  92. imzala-0.1.0/generated/imzala_client/models/webhook_data_party_rejected.py +99 -0
  93. imzala-0.1.0/generated/imzala_client/models/webhook_data_party_rejected_party.py +108 -0
  94. imzala-0.1.0/generated/imzala_client/models/webhook_data_party_signed.py +94 -0
  95. imzala-0.1.0/generated/imzala_client/models/webhook_data_party_viewed.py +92 -0
  96. imzala-0.1.0/generated/imzala_client/models/webhook_envelope.py +114 -0
  97. imzala-0.1.0/generated/imzala_client/py.typed +0 -0
  98. imzala-0.1.0/generated/imzala_client/rest.py +264 -0
  99. imzala-0.1.0/imzala/__init__.py +33 -0
  100. imzala-0.1.0/imzala/client.py +581 -0
  101. imzala-0.1.0/imzala/errors.py +197 -0
  102. imzala-0.1.0/imzala/files.py +57 -0
  103. imzala-0.1.0/imzala/py.typed +0 -0
  104. imzala-0.1.0/imzala/webhook.py +69 -0
  105. imzala-0.1.0/imzala.egg-info/PKG-INFO +13 -0
  106. imzala-0.1.0/imzala.egg-info/SOURCES.txt +115 -0
  107. imzala-0.1.0/imzala.egg-info/dependency_links.txt +1 -0
  108. imzala-0.1.0/imzala.egg-info/requires.txt +7 -0
  109. imzala-0.1.0/imzala.egg-info/top_level.txt +2 -0
  110. imzala-0.1.0/pyproject.toml +44 -0
  111. imzala-0.1.0/setup.cfg +4 -0
  112. imzala-0.1.0/tests/test_client.py +162 -0
  113. imzala-0.1.0/tests/test_errors.py +102 -0
  114. imzala-0.1.0/tests/test_lifecycle.py +199 -0
  115. imzala-0.1.0/tests/test_pagination.py +79 -0
  116. imzala-0.1.0/tests/test_retry.py +194 -0
  117. imzala-0.1.0/tests/test_webhook.py +66 -0
imzala-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: imzala
3
+ Version: 0.1.0
4
+ Summary: Official server-side SDK for the imzala.org External API (typed facade over a generated urllib3/pydantic client).
5
+ Author-email: imzala Destek <destek@imzala.org>
6
+ License: Proprietary
7
+ Requires-Python: >=3.9
8
+ Requires-Dist: urllib3<3.0.0,>=2.1.0
9
+ Requires-Dist: python-dateutil>=2.8.2
10
+ Requires-Dist: pydantic>=2.11
11
+ Requires-Dist: typing-extensions>=4.7.1
12
+ Provides-Extra: dev
13
+ Requires-Dist: pytest>=7.2.1; extra == "dev"
imzala-0.1.0/README.md ADDED
@@ -0,0 +1,181 @@
1
+ # imzala (Python)
2
+
3
+ İmzala dijital imza platformu resmi Python SDK'sı.
4
+
5
+ > ⚠️ Geliştirme aşamasında, yayın öncesi avukat onayı bekliyor. Kapsam ve
6
+ > yayın kararları için monorepo kökündeki [RELEASING.md](../../RELEASING.md).
7
+
8
+ ## Kurulum
9
+
10
+ ```bash
11
+ pip install imzala
12
+ ```
13
+
14
+ Python 3.9+ gerektirir.
15
+
16
+ ## Hızlı başlangıç
17
+
18
+ ```python
19
+ import os
20
+ from imzala import Imzala
21
+
22
+ client = Imzala(api_key=os.environ["IMZALA_API_KEY"])
23
+
24
+ # Aktif şablonlarını listele
25
+ templates = client.templates.list()
26
+
27
+ # Bir şablondan yeni sözleşme (demand) oluştur
28
+ demand = client.demands.create({
29
+ "template_id": templates["templates"][0]["id"],
30
+ "party_mapping": [
31
+ {
32
+ "template_party_id": templates["templates"][0]["parties"][0]["id"],
33
+ "first_name": "Ahmet",
34
+ "last_name": "Yılmaz",
35
+ "email": "ahmet@example.com",
36
+ },
37
+ ],
38
+ })
39
+
40
+ print(demand["signing_urls"]) # her taraf için imzalama linki
41
+ ```
42
+
43
+ `base_url` varsayılan olarak `https://api-prd.imzala.org`'dur; test ortamı
44
+ için `Imzala(api_key=..., base_url="https://test-api.imzala.org")`.
45
+
46
+ ## Kaynaklar
47
+
48
+ - `client.templates.list(page=None, limit=None)` / `.get(template_id)` /
49
+ `.usage(template_id)` / `.list_all(page=None, limit=None)` (bkz. aşağıdaki
50
+ sayfalama notu)
51
+ - `client.demands.create(body)` / `.get(demand_id)` /
52
+ `.add_items(demand_id, body)` /
53
+ `.upload_document(files=[...], parties=[...], order=None, title=None, description=None)` /
54
+ `.send_reminder(demand_id, body=None)`
55
+ - `client.embed.create_session(demand_id, party_id=...)`: bkz. aşağıdaki
56
+ gömülü imza notu
57
+ - `client.timestamps.create(content=..., filename=..., idempotency_key=None, ...)`
58
+ - `client.me()`: API anahtarının sahibi (id, e-posta, workspace, kalan kredi)
59
+
60
+ Dosya yükleyen metodlar `FileInput` (dataclass: `content: bytes, filename: str,
61
+ content_type: Optional[str]`) veya doğrudan `content=`/`filename=` keyword'lerini
62
+ kabul eder; Flask/FastAPI upload'larından gelen bytes'ı doğrudan geçebilirsiniz.
63
+
64
+ ## Otomatik yeniden deneme (safe auto-retry)
65
+
66
+ Yalnızca **idempotent GET** metodları (`templates.list` / `.get` /
67
+ `.usage`, `demands.get`, `me()`) 429 (rate limit — `Retry-After`
68
+ header'ına uyar) veya 5xx (sunucu hatası) aldığında, exponential backoff +
69
+ jitter ile otomatik olarak yeniden denenir:
70
+
71
+ ```python
72
+ client = Imzala(
73
+ api_key=os.environ["IMZALA_API_KEY"],
74
+ max_retries=2, # varsayılan 2 deneme; 0 = kapalı
75
+ retry_base_delay=0.3, # saniye cinsinden taban gecikme, varsayılan 0.3 (300ms)
76
+ )
77
+ ```
78
+
79
+ **🔴 Güvenlik:** `demands.create` / `.add_items` / `.upload_document` /
80
+ `.send_reminder`, `embed.create_session`, `timestamps.create` gibi
81
+ **yazma (POST)** metodları **hiçbir zaman** otomatik yeniden denenmez —
82
+ tekrarlanan bir `create` çağrısı **mükerrer sözleşme** oluşturur,
83
+ tekrarlanan bir `send_reminder` ise **çift SMS/e-posta** gönderir. Bu
84
+ davranış `max_retries` ile değiştirilemez: yeniden deneme sarmalayıcısı
85
+ yalnızca GET çağrılarına uygulanır, POST/PUT/PATCH/DELETE çağıran
86
+ metodların bu sarmalayıcıya girme yolu yoktur.
87
+
88
+ ## Sayfalama iterator'ü
89
+
90
+ `templates.list()` tek sayfa döner; aktif tüm şablonlarınızı tek tek
91
+ dolaşmak için `list_all()` kullanın. Dahili olarak `list(page=, limit=)`
92
+ çağrısını tekrarlayıp `page`'i artırır; sayfa kısa geldiğinde (istenen
93
+ sayıdan az öğe) veya cevaptaki `total`'a ulaşıldığında durur — bu yüzden
94
+ sonsuz döngü riski yoktur:
95
+
96
+ ```python
97
+ for template in client.templates.list_all():
98
+ print(template["id"], template["name"])
99
+
100
+ # page/limit override edilebilir:
101
+ for template in client.templates.list_all(limit=50):
102
+ ...
103
+ ```
104
+
105
+ ## Webhook doğrulama
106
+
107
+ ```python
108
+ from flask import Flask, request, abort
109
+ from imzala import verify_webhook
110
+ import os
111
+
112
+ app = Flask(__name__)
113
+
114
+ @app.post("/webhooks/imzala")
115
+ def imzala_webhook():
116
+ raw_body = request.get_data() # ham body, JSON parse ETMEDEN önce
117
+ valid = verify_webhook(
118
+ os.environ["IMZALA_WEBHOOK_SECRET"],
119
+ raw_body,
120
+ request.headers.get("X-Imzala-Signature-256"),
121
+ )
122
+ if not valid:
123
+ abort(401)
124
+
125
+ event = request.get_json()
126
+ # ... event["type"]'a göre işle
127
+ return "", 200
128
+ ```
129
+
130
+ `verify_webhook` asla exception fırlatmaz; geçersiz/eksik imzada `False`
131
+ döner. Body'yi parse edip yeniden serialize etmeyin (FastAPI için
132
+ `await request.body()`, Django için `request.body`).
133
+
134
+ ## Hata yönetimi
135
+
136
+ ```python
137
+ from imzala import (
138
+ Imzala,
139
+ ImzalaError,
140
+ ImzalaAuthError,
141
+ ImzalaRateLimitError,
142
+ ImzalaValidationError,
143
+ )
144
+
145
+ try:
146
+ client.demands.get(demand_id)
147
+ except ImzalaRateLimitError as err:
148
+ print(f"Rate limit: {err.retry_after} sn sonra tekrar dene")
149
+ except ImzalaAuthError:
150
+ print("API anahtarı geçersiz veya yetkisiz")
151
+ except ImzalaValidationError as err:
152
+ print("İstek doğrulanamadı:", err.body)
153
+ except ImzalaError as err:
154
+ print("İmzala API hatası:", err.status_code, str(err))
155
+ ```
156
+
157
+ Tüm hatalar `ImzalaError`'dan türer (`status_code`, `body`, `code` alanları
158
+ ortak); 401/403 → `ImzalaAuthError`, 429 → `ImzalaRateLimitError`
159
+ (`retry_after` saniye), 422 → `ImzalaValidationError`.
160
+
161
+ ## ⚠️ Sunucu-taraflı
162
+
163
+ Bu paket **sadece sunucuda** kullanılır. API anahtarınızı tarayıcı
164
+ JavaScript'ine veya mobil uygulamaya asla gömmeyin: sızarsa hesabınızdaki
165
+ tüm sözleşme/şablon/zaman damgası işlemlerine erişim kazanılır. Tarayıcıda
166
+ imza almak için [`@imzala/embed`](../embed) veya
167
+ [`@imzala/embed-react`](../embed-react) kullanın.
168
+
169
+ ## İmza sınıfı notu
170
+
171
+ İmzala dijital imza (SES) üretir; her imza zaman damgalıdır. Nitelikli/
172
+ güvenli elektronik imza (QES) DEĞİLDİR.
173
+
174
+ `client.embed.create_session(...)` şu an **yalnızca test ortamında** çalışır;
175
+ gömülü imza özelliği henüz avukat onaylı prod-canlı değildir. Kapsam kararı
176
+ [RELEASING.md](../../RELEASING.md)'de.
177
+
178
+ ## Daha fazla
179
+
180
+ - [Monorepo README](../../README.md): tüm paketler + genel desen
181
+ - [RELEASING.md](../../RELEASING.md): sürüm yayınlama, kapsam kararları
@@ -0,0 +1,221 @@
1
+ # coding: utf-8
2
+
3
+ # flake8: noqa
4
+
5
+ """
6
+ imzala External API
7
+
8
+ imzala.org dış API'si — şablondan sözleşme oluşturma ve takip. **Sürüm:** 1.6.0 · **Son güncelleme:** 2026-06-30 ## Auth Tüm istekler `X-API-Key` header'ı gerektirir. API key dashboard üzerinden oluşturulur: **API & Geliştirici** sayfası (https://app.imzala.org/developer) veya **Hesap Ayarları -> API Anahtarları**. ## Workspace (organizasyon) Organizasyon içinde oluşturulmuş bir API key kullanıyorsanız `X-Workspace-Id` header'ı göndermeniz gerekir (organizasyon UUID'si). Kişisel anahtarlar için bu header gerekmez. ## Multi-Party Variables (parti-bazlı ve ortak field'lar) `POST /api/v1/demands` payload'ında iki tip \"variables\" alanı vardır: - `party_mapping[i].variables` — **bu partiye ait** field'lar (örn. Kira sözleşmesinde Kiraya Veren'in `address`, `iban` field'ları) - `variables` (root) — **partilerden bağımsız** field'lar (örn. `kira_baslangic_tarihi`, `kira_bedeli`) Resolution sırası: 1. Item'ın template_party_id'si var ve o parti slug'ı göndermişse → uygula 2. Yoksa root `variables`'tan ara → varsa uygula 3. Yoksa atla Dashboard'daki **API Kullanımı** tab'ı (`/sablonlar/<id>`) hangi field'in hangi gruba gittiğini gösterir. Veya yeni `GET /api/v1/templates/{id}/usage` endpoint'i aynı bilgiyi JSON olarak döner. ## Sessiz Başarısızlık Yok `POST /api/v1/demands` cevabında `variables_ignored` array'ı, gönderdiğiniz ama şablonda eşleşmeyen slug'ları listeler. Boş olmadığında yazım hatası yapmışsınız demektir — log'ta veya dashboard'da kontrol edin. ## Rate Limit - 60 istek/dakika per API key - Aşılırsa 429 döner ## Hatalar Standart HTTP kodları: 400 (geçersiz veri), 401 (auth), 403 (yetki), 404 (yok), 429 (rate limit), 500 (sunucu) ## Loglar Tüm API istekleriniz dashboard'da `Geliştirici -> Etkinlik Logu` sayfasında görünür (request body, response body, headers, status code, süre). 30 gün retention. ## Hatırlatma Sistemi İmzalanmamış taraflara hatırlatma SMS/e-posta'sı **iki yolla** gönderilir: **1. Otomatik (scheduled) hatırlatmalar — şablona/sözleşmeye gömülü** Şablon (Template) seviyesinde `reminder_settings` (interval saatleri, max sayısı, kanallar) tanımlayabilirsiniz. Şablondan demand oluştururken bu değerler yeni sözleşmenin `ReminderConfig` satırına otomatik kopyalanır ve BullMQ worker'ı zamanı geldiğinde sessiz şekilde hatırlatır. - Dashboard editörden ayarlanır: `app.imzala.org/sablonlar/<id>/duzenle` → **Sözleşme Ayarları** → **Otomatik Hatırlatma** + **Hatırlatma Kanalı** - Veya `POST /api/v1/demands` çağrısında body'de `reminder_settings` alanıyla **bu sözleşme için override** edebilirsiniz (şablon default'unu ezer, sadece bu demand'a uygulanır) - Default: `{enabled: true, intervals_hours: [48], max_reminders: 1, channels: [\"email\"]}` **2. Manuel (anlık) hatırlatma — tetikleme endpoint'i** `POST /api/v1/demands/{id}/reminders` ile **şu an** SMS/e-posta hatırlatması gönderebilirsiniz. Anti-spam: Aynı sözleşme için son hatırlatmadan 5 dakika geçmemişse 429 `RATE_LIMITED` döner; `force: true` ile override edilebilir. **Kişi başına sert sınırlar (override edilemez):** - Bir kişiye en fazla 3 SMS reminder gönderilebilir (otomatik scheduled + manuel trigger toplam). - Bir kişiye en fazla 3 e-posta reminder gönderilebilir. - Sınıra ulaşan kişi response'un `details[]` listesinde `skipped` olarak görünür (`reason: \"party_sms_cap_reached (3)\"` veya `\"party_email_cap_reached (3)\"`); diğer kişilere gönderim devam eder. - `force: true` bu kişi-başı sınırları override etmez. ```bash # Default — SMS + e-posta birlikte (parti eligibility'sine göre) curl -X POST https://api-prd.imzala.org/api/v1/demands/<demand_id>/reminders \\ -H \"X-API-Key: imz_...\" \\ -H \"Content-Type: application/json\" -d '{}' # Sadece SMS, anti-spam override curl -X POST https://api-prd.imzala.org/api/v1/demands/<demand_id>/reminders \\ -H \"X-API-Key: imz_...\" \\ -H \"Content-Type: application/json\" \\ -d '{\"channels\": [\"sms\"], \"force\": true}' ``` Detay için **Reminders** tag'i altındaki endpoint'e bakın. ## Webhooks imzala olay gerçekleştiğinde (sözleşme tamamlandı, taraf imzaladı vb.) sizin belirlediğiniz HTTPS URL'ye `POST` ile JSON payload gönderir. Webhook'lar dashboard'dan yönetilir: **Ayarlar -> Webhook'lar** (https://app.imzala.org/settings/webhooks). API üzerinden CRUD desteklenmez. ### Workspace kapsamı - **Organizasyon webhook'u** (org workspace'inde oluşturulduysa) → o organizasyon altındaki TÜM üyelerin event'lerinde tetiklenir - **Kişisel webhook** (kişisel workspace'te) → sadece sizin kendi event'lerinizde tetiklenir ### Olay tipleri (6) | Olay | Tetikleyici | |------|-------------| | `demand.created` | Yeni sözleşme oluşturuldu | | `demand.completed` | Tüm taraflar imzaladı | | `demand.expired` | Sözleşme süresi doldu | | `party.signed` | Bir taraf imzaladı | | `party.viewed` | Bir taraf imza sayfasını ilk kez açtı | | `party.rejected` | Bir taraf reddetti | ### Header'lar Her istekte aşağıdaki header'lar gönderilir: ``` Content-Type: application/json User-Agent: Imzala-Webhook/1.0 X-Imzala-Event: <olay tipi, örn. demand.completed> X-Imzala-Delivery: <delivery UUID — idempotency key> X-Imzala-Signature-256: sha256=<HMAC-SHA256 hex> ``` ### Payload zarfı Tüm olaylar aynı zarfı kullanır: ```json { \"id\": \"evt_abc123...\", \"type\": \"demand.completed\", \"created_at\": \"2026-05-07T08:30:00.000Z\", \"data\": { \"...olay-özel alanlar...\" } } ``` - `id` — `evt_<32-hex>`. Idempotency için kullanın (DB'de unique key). - `type` — yukarıdaki 6 olay tipinden biri (lowercase). - `created_at` — olay zamanı (ISO 8601 UTC). - `data` — her olaya özel (aşağıda her olay için ayrı şema). ### İmza doğrulama (HMAC-SHA256) Webhook oluşturduğunuzda dashboard size `whsec_<64-hex>` formatında bir secret döner — **sadece bir kez gösterilir**, güvenli yere kaydedin. Her isteğin ham gövdesi (body) bu secret ile HMAC-SHA256 imzalanır ve `X-Imzala-Signature-256: sha256=<hex>` header'ında gönderilir. Doğrulama Node.js örneği: ```js const crypto = require('crypto'); function verify(rawBody, header, secret) { const expected = 'sha256=' + crypto .createHmac('sha256', secret) .update(rawBody, 'utf8') .digest('hex'); return crypto.timingSafeEqual( Buffer.from(header || '', 'utf8'), Buffer.from(expected, 'utf8') ); } // Express app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const sig = req.header('X-Imzala-Signature-256'); if (!verify(req.body, sig, process.env.IMZALA_WEBHOOK_SECRET)) { return res.status(401).send('invalid signature'); } const event = JSON.parse(req.body.toString('utf8')); // ... event'i kuyruğa koy ve hemen 2xx dön res.status(200).send('ok'); }); ``` > **Önemli:** Body'yi parse etmeden ham byte üzerinden imzalayın. Çoğu > framework (Express, FastAPI vs.) \"raw body\" middleware'i sağlar. ### Yeniden deneme politikası - **Başarı:** HTTP 2xx — delivery `SENT` olarak işaretlenir. - **Başarısızlık:** 2xx dışı veya bağlantı hatası — yeniden denenir. - **Per-attempt timeout:** 10 saniye (yapılandırılabilir env: `WEBHOOK_TIMEOUT_MS`). - **Maksimum deneme:** 6 (ilk + 5 retry). - **Backoff (exponential):** 30s → 2dk → 10dk → 30dk → 2sa. - **Tükenirse:** delivery `DEAD_LETTER` olur, dashboard'dan manuel \"Tekrar Gönder\" mümkün. Endpoint'iniz **10 saniyeden kısa sürede 2xx dönmelidir**. Ağır işleri (DB yazma, e-posta vs.) async kuyruğa atın. ### Idempotency Aynı olay birden fazla kez gönderilebilir (network retry, manuel redeliver, backfill). Receiver tarafında **`payload.id`** unique olduğu için bunu DB'de tek seferlik kayıt için kullanın: ```sql CREATE TABLE imzala_webhook_seen ( event_id TEXT PRIMARY KEY, received_at TIMESTAMPTZ DEFAULT now() ); -- INSERT ... ON CONFLICT DO NOTHING; sonuç 0 satır ise zaten gördük → skip ``` ### Backfill flag Geçmiş olayları yeniden tetiklemek (örn. webhook bug fix'inden sonra kayıp event'leri yakalamak) için bazı payload'larda `data._backfill: true` bayrağı bulunur. Bu durumda receiver: - Loglama için kayıt edebilir - Side-effect tetikleyicilerini (ödeme, e-posta gönderme, vs.) **atlamalı** - `id` zaten görülmüşse normal flow'a devam edebilir ```js if (event.data._backfill === true) { await logReplay(event); return res.status(200).send('replay accepted'); } ``` ### Manuel yeniden gönderim Dashboard'da `Ayarlar -> Webhook'lar -> <webhook> -> Teslim Geçmişi`: - Her satırda **Tekrar Gönder** butonu (PENDING dışında her statü için) - Üstte **Son 5'i Tekrar Gönder** toplu butonu (max 50 değiştirilebilir) - Yeni delivery kaydı oluşur, orijinali bozmaz (audit trail korunur) ### En iyi pratikler 1. Aynı `id`'yi tekrar görürseniz işlemi atla (idempotency). 2. İmzayı **timing-safe compare** ile doğrula (string equality değil). 3. 10sn'den hızlı 2xx dön; ağır işi kuyruğa at. 4. `_backfill: true` payload'larda side-effect'leri atla. 5. `X-Imzala-Delivery` UUID'sini log'la — destek talebinde bizimkiyle eşleşmesini kolaylaştırır. 6. HTTPS endpoint kullan; secret'i env var'da sakla, koda gömme.
9
+
10
+ The version of the OpenAPI document: 1.7.0
11
+ Contact: destek@imzala.org
12
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
13
+
14
+ Do not edit the class manually.
15
+ """ # noqa: E501
16
+
17
+
18
+ __version__ = "1.0.0"
19
+
20
+ # Define package exports
21
+ __all__ = [
22
+ "AccountApi",
23
+ "DemandsApi",
24
+ "RemindersApi",
25
+ "TemplatesApi",
26
+ "TimestampsApi",
27
+ "ApiResponse",
28
+ "ApiClient",
29
+ "Configuration",
30
+ "OpenApiException",
31
+ "ApiTypeError",
32
+ "ApiValueError",
33
+ "ApiKeyError",
34
+ "ApiAttributeError",
35
+ "ApiException",
36
+ "ApiError",
37
+ "ApiV1DemandsGet200Response",
38
+ "ApiV1DemandsGet200ResponseData",
39
+ "ApiV1DemandsGet200ResponseDataDemandsInner",
40
+ "ApiV1DemandsIdCancelPost200Response",
41
+ "ApiV1DemandsIdCancelPost200ResponseData",
42
+ "ApiV1DemandsIdCancelPostRequest",
43
+ "ApiV1DemandsIdDelete409Response",
44
+ "ApiV1DemandsIdEmbedSessionPost200Response",
45
+ "ApiV1DemandsIdEmbedSessionPost200ResponseData",
46
+ "ApiV1DemandsIdEmbedSessionPostRequest",
47
+ "ApiV1DemandsIdGet200Response",
48
+ "ApiV1DemandsIdPartiesPartyIdResendPost200Response",
49
+ "ApiV1DemandsIdPartiesPartyIdResendPost200ResponseData",
50
+ "ApiV1DemandsIdRemindersPost200Response",
51
+ "ApiV1DemandsIdRemindersPost200ResponseData",
52
+ "ApiV1DemandsIdRemindersPost200ResponseDataDispatchedInner",
53
+ "ApiV1DemandsIdRemindersPost200ResponseDataSkippedInner",
54
+ "ApiV1DemandsIdRemindersPost429Response",
55
+ "ApiV1DemandsIdRemindersPost429ResponseError",
56
+ "ApiV1DemandsIdTimelineGet200Response",
57
+ "ApiV1DemandsIdTimelineGet200ResponseData",
58
+ "ApiV1DemandsIdTimelineGet200ResponseDataEventsInner",
59
+ "ApiV1DemandsPost201Response",
60
+ "ApiV1DemandsUploadPost201Response",
61
+ "ApiV1MeGet200Response",
62
+ "ApiV1MeGet200ResponseData",
63
+ "ApiV1MeGet200ResponseDataCredits",
64
+ "ApiV1MeGet200ResponseDataWorkspace",
65
+ "ApiV1TemplatesGet200Response",
66
+ "ApiV1TemplatesGet200ResponseData",
67
+ "ApiV1TemplatesGet401Response",
68
+ "ApiV1TemplatesIdDelete200Response",
69
+ "ApiV1TemplatesIdDelete200ResponseData",
70
+ "ApiV1TemplatesIdGet200Response",
71
+ "ApiV1TemplatesIdGet404Response",
72
+ "ApiV1TemplatesIdPatch200Response",
73
+ "ApiV1TemplatesIdPatch200ResponseData",
74
+ "ApiV1TemplatesIdPatchRequest",
75
+ "ApiV1TemplatesIdUsageGet200Response",
76
+ "ApiV1TimestampsPost201Response",
77
+ "ApiV1TimestampsPostRequest1",
78
+ "CreateDemandRequest",
79
+ "CreatedDemand",
80
+ "CreatedDemandSigningUrlsInner",
81
+ "CreatedDemandUpload",
82
+ "DemandPage",
83
+ "DemandStatus",
84
+ "DemandStatusPartiesInner",
85
+ "PageItem",
86
+ "PartyMappingInput",
87
+ "PartyMappingInputVariablesValue",
88
+ "ReminderSettings",
89
+ "StandardError",
90
+ "StandardErrorError",
91
+ "TemplateDetail",
92
+ "TemplatePartySummary",
93
+ "TemplateSummary",
94
+ "TemplateSummaryPartiesInner",
95
+ "TemplateUsage",
96
+ "TemplateUsageEndpoint",
97
+ "TemplateUsageExampleRequest",
98
+ "TemplateUsagePartiesInner",
99
+ "TemplateUsagePartiesInnerSupportedFieldsInner",
100
+ "TemplateUsageVariablesInner",
101
+ "TemplateVariable",
102
+ "TimestampRecord",
103
+ "TriggerReminderRequest",
104
+ "UpsertItemsRequest",
105
+ "UpsertItemsResponse",
106
+ "UpsertItemsResponseData",
107
+ "UpsertItemsResponseDataItemsInner",
108
+ "WebhookDataDemandCompleted",
109
+ "WebhookDataDemandCompletedPartiesInner",
110
+ "WebhookDataDemandCreated",
111
+ "WebhookDataDemandExpired",
112
+ "WebhookDataDemandExpiredPartiesInner",
113
+ "WebhookDataPartyRejected",
114
+ "WebhookDataPartyRejectedParty",
115
+ "WebhookDataPartySigned",
116
+ "WebhookDataPartyViewed",
117
+ "WebhookEnvelope",
118
+ ]
119
+
120
+ # import apis into sdk package
121
+ from imzala_client.api.account_api import AccountApi as AccountApi
122
+ from imzala_client.api.demands_api import DemandsApi as DemandsApi
123
+ from imzala_client.api.reminders_api import RemindersApi as RemindersApi
124
+ from imzala_client.api.templates_api import TemplatesApi as TemplatesApi
125
+ from imzala_client.api.timestamps_api import TimestampsApi as TimestampsApi
126
+
127
+ # import ApiClient
128
+ from imzala_client.api_response import ApiResponse as ApiResponse
129
+ from imzala_client.api_client import ApiClient as ApiClient
130
+ from imzala_client.configuration import Configuration as Configuration
131
+ from imzala_client.exceptions import OpenApiException as OpenApiException
132
+ from imzala_client.exceptions import ApiTypeError as ApiTypeError
133
+ from imzala_client.exceptions import ApiValueError as ApiValueError
134
+ from imzala_client.exceptions import ApiKeyError as ApiKeyError
135
+ from imzala_client.exceptions import ApiAttributeError as ApiAttributeError
136
+ from imzala_client.exceptions import ApiException as ApiException
137
+
138
+ # import models into sdk package
139
+ from imzala_client.models.api_error import ApiError as ApiError
140
+ from imzala_client.models.api_v1_demands_get200_response import ApiV1DemandsGet200Response as ApiV1DemandsGet200Response
141
+ from imzala_client.models.api_v1_demands_get200_response_data import ApiV1DemandsGet200ResponseData as ApiV1DemandsGet200ResponseData
142
+ from imzala_client.models.api_v1_demands_get200_response_data_demands_inner import ApiV1DemandsGet200ResponseDataDemandsInner as ApiV1DemandsGet200ResponseDataDemandsInner
143
+ from imzala_client.models.api_v1_demands_id_cancel_post200_response import ApiV1DemandsIdCancelPost200Response as ApiV1DemandsIdCancelPost200Response
144
+ from imzala_client.models.api_v1_demands_id_cancel_post200_response_data import ApiV1DemandsIdCancelPost200ResponseData as ApiV1DemandsIdCancelPost200ResponseData
145
+ from imzala_client.models.api_v1_demands_id_cancel_post_request import ApiV1DemandsIdCancelPostRequest as ApiV1DemandsIdCancelPostRequest
146
+ from imzala_client.models.api_v1_demands_id_delete409_response import ApiV1DemandsIdDelete409Response as ApiV1DemandsIdDelete409Response
147
+ from imzala_client.models.api_v1_demands_id_embed_session_post200_response import ApiV1DemandsIdEmbedSessionPost200Response as ApiV1DemandsIdEmbedSessionPost200Response
148
+ from imzala_client.models.api_v1_demands_id_embed_session_post200_response_data import ApiV1DemandsIdEmbedSessionPost200ResponseData as ApiV1DemandsIdEmbedSessionPost200ResponseData
149
+ from imzala_client.models.api_v1_demands_id_embed_session_post_request import ApiV1DemandsIdEmbedSessionPostRequest as ApiV1DemandsIdEmbedSessionPostRequest
150
+ from imzala_client.models.api_v1_demands_id_get200_response import ApiV1DemandsIdGet200Response as ApiV1DemandsIdGet200Response
151
+ from imzala_client.models.api_v1_demands_id_parties_party_id_resend_post200_response import ApiV1DemandsIdPartiesPartyIdResendPost200Response as ApiV1DemandsIdPartiesPartyIdResendPost200Response
152
+ from imzala_client.models.api_v1_demands_id_parties_party_id_resend_post200_response_data import ApiV1DemandsIdPartiesPartyIdResendPost200ResponseData as ApiV1DemandsIdPartiesPartyIdResendPost200ResponseData
153
+ from imzala_client.models.api_v1_demands_id_reminders_post200_response import ApiV1DemandsIdRemindersPost200Response as ApiV1DemandsIdRemindersPost200Response
154
+ from imzala_client.models.api_v1_demands_id_reminders_post200_response_data import ApiV1DemandsIdRemindersPost200ResponseData as ApiV1DemandsIdRemindersPost200ResponseData
155
+ from imzala_client.models.api_v1_demands_id_reminders_post200_response_data_dispatched_inner import ApiV1DemandsIdRemindersPost200ResponseDataDispatchedInner as ApiV1DemandsIdRemindersPost200ResponseDataDispatchedInner
156
+ from imzala_client.models.api_v1_demands_id_reminders_post200_response_data_skipped_inner import ApiV1DemandsIdRemindersPost200ResponseDataSkippedInner as ApiV1DemandsIdRemindersPost200ResponseDataSkippedInner
157
+ from imzala_client.models.api_v1_demands_id_reminders_post429_response import ApiV1DemandsIdRemindersPost429Response as ApiV1DemandsIdRemindersPost429Response
158
+ from imzala_client.models.api_v1_demands_id_reminders_post429_response_error import ApiV1DemandsIdRemindersPost429ResponseError as ApiV1DemandsIdRemindersPost429ResponseError
159
+ from imzala_client.models.api_v1_demands_id_timeline_get200_response import ApiV1DemandsIdTimelineGet200Response as ApiV1DemandsIdTimelineGet200Response
160
+ from imzala_client.models.api_v1_demands_id_timeline_get200_response_data import ApiV1DemandsIdTimelineGet200ResponseData as ApiV1DemandsIdTimelineGet200ResponseData
161
+ from imzala_client.models.api_v1_demands_id_timeline_get200_response_data_events_inner import ApiV1DemandsIdTimelineGet200ResponseDataEventsInner as ApiV1DemandsIdTimelineGet200ResponseDataEventsInner
162
+ from imzala_client.models.api_v1_demands_post201_response import ApiV1DemandsPost201Response as ApiV1DemandsPost201Response
163
+ from imzala_client.models.api_v1_demands_upload_post201_response import ApiV1DemandsUploadPost201Response as ApiV1DemandsUploadPost201Response
164
+ from imzala_client.models.api_v1_me_get200_response import ApiV1MeGet200Response as ApiV1MeGet200Response
165
+ from imzala_client.models.api_v1_me_get200_response_data import ApiV1MeGet200ResponseData as ApiV1MeGet200ResponseData
166
+ from imzala_client.models.api_v1_me_get200_response_data_credits import ApiV1MeGet200ResponseDataCredits as ApiV1MeGet200ResponseDataCredits
167
+ from imzala_client.models.api_v1_me_get200_response_data_workspace import ApiV1MeGet200ResponseDataWorkspace as ApiV1MeGet200ResponseDataWorkspace
168
+ from imzala_client.models.api_v1_templates_get200_response import ApiV1TemplatesGet200Response as ApiV1TemplatesGet200Response
169
+ from imzala_client.models.api_v1_templates_get200_response_data import ApiV1TemplatesGet200ResponseData as ApiV1TemplatesGet200ResponseData
170
+ from imzala_client.models.api_v1_templates_get401_response import ApiV1TemplatesGet401Response as ApiV1TemplatesGet401Response
171
+ from imzala_client.models.api_v1_templates_id_delete200_response import ApiV1TemplatesIdDelete200Response as ApiV1TemplatesIdDelete200Response
172
+ from imzala_client.models.api_v1_templates_id_delete200_response_data import ApiV1TemplatesIdDelete200ResponseData as ApiV1TemplatesIdDelete200ResponseData
173
+ from imzala_client.models.api_v1_templates_id_get200_response import ApiV1TemplatesIdGet200Response as ApiV1TemplatesIdGet200Response
174
+ from imzala_client.models.api_v1_templates_id_get404_response import ApiV1TemplatesIdGet404Response as ApiV1TemplatesIdGet404Response
175
+ from imzala_client.models.api_v1_templates_id_patch200_response import ApiV1TemplatesIdPatch200Response as ApiV1TemplatesIdPatch200Response
176
+ from imzala_client.models.api_v1_templates_id_patch200_response_data import ApiV1TemplatesIdPatch200ResponseData as ApiV1TemplatesIdPatch200ResponseData
177
+ from imzala_client.models.api_v1_templates_id_patch_request import ApiV1TemplatesIdPatchRequest as ApiV1TemplatesIdPatchRequest
178
+ from imzala_client.models.api_v1_templates_id_usage_get200_response import ApiV1TemplatesIdUsageGet200Response as ApiV1TemplatesIdUsageGet200Response
179
+ from imzala_client.models.api_v1_timestamps_post201_response import ApiV1TimestampsPost201Response as ApiV1TimestampsPost201Response
180
+ from imzala_client.models.api_v1_timestamps_post_request1 import ApiV1TimestampsPostRequest1 as ApiV1TimestampsPostRequest1
181
+ from imzala_client.models.create_demand_request import CreateDemandRequest as CreateDemandRequest
182
+ from imzala_client.models.created_demand import CreatedDemand as CreatedDemand
183
+ from imzala_client.models.created_demand_signing_urls_inner import CreatedDemandSigningUrlsInner as CreatedDemandSigningUrlsInner
184
+ from imzala_client.models.created_demand_upload import CreatedDemandUpload as CreatedDemandUpload
185
+ from imzala_client.models.demand_page import DemandPage as DemandPage
186
+ from imzala_client.models.demand_status import DemandStatus as DemandStatus
187
+ from imzala_client.models.demand_status_parties_inner import DemandStatusPartiesInner as DemandStatusPartiesInner
188
+ from imzala_client.models.page_item import PageItem as PageItem
189
+ from imzala_client.models.party_mapping_input import PartyMappingInput as PartyMappingInput
190
+ from imzala_client.models.party_mapping_input_variables_value import PartyMappingInputVariablesValue as PartyMappingInputVariablesValue
191
+ from imzala_client.models.reminder_settings import ReminderSettings as ReminderSettings
192
+ from imzala_client.models.standard_error import StandardError as StandardError
193
+ from imzala_client.models.standard_error_error import StandardErrorError as StandardErrorError
194
+ from imzala_client.models.template_detail import TemplateDetail as TemplateDetail
195
+ from imzala_client.models.template_party_summary import TemplatePartySummary as TemplatePartySummary
196
+ from imzala_client.models.template_summary import TemplateSummary as TemplateSummary
197
+ from imzala_client.models.template_summary_parties_inner import TemplateSummaryPartiesInner as TemplateSummaryPartiesInner
198
+ from imzala_client.models.template_usage import TemplateUsage as TemplateUsage
199
+ from imzala_client.models.template_usage_endpoint import TemplateUsageEndpoint as TemplateUsageEndpoint
200
+ from imzala_client.models.template_usage_example_request import TemplateUsageExampleRequest as TemplateUsageExampleRequest
201
+ from imzala_client.models.template_usage_parties_inner import TemplateUsagePartiesInner as TemplateUsagePartiesInner
202
+ from imzala_client.models.template_usage_parties_inner_supported_fields_inner import TemplateUsagePartiesInnerSupportedFieldsInner as TemplateUsagePartiesInnerSupportedFieldsInner
203
+ from imzala_client.models.template_usage_variables_inner import TemplateUsageVariablesInner as TemplateUsageVariablesInner
204
+ from imzala_client.models.template_variable import TemplateVariable as TemplateVariable
205
+ from imzala_client.models.timestamp_record import TimestampRecord as TimestampRecord
206
+ from imzala_client.models.trigger_reminder_request import TriggerReminderRequest as TriggerReminderRequest
207
+ from imzala_client.models.upsert_items_request import UpsertItemsRequest as UpsertItemsRequest
208
+ from imzala_client.models.upsert_items_response import UpsertItemsResponse as UpsertItemsResponse
209
+ from imzala_client.models.upsert_items_response_data import UpsertItemsResponseData as UpsertItemsResponseData
210
+ from imzala_client.models.upsert_items_response_data_items_inner import UpsertItemsResponseDataItemsInner as UpsertItemsResponseDataItemsInner
211
+ from imzala_client.models.webhook_data_demand_completed import WebhookDataDemandCompleted as WebhookDataDemandCompleted
212
+ from imzala_client.models.webhook_data_demand_completed_parties_inner import WebhookDataDemandCompletedPartiesInner as WebhookDataDemandCompletedPartiesInner
213
+ from imzala_client.models.webhook_data_demand_created import WebhookDataDemandCreated as WebhookDataDemandCreated
214
+ from imzala_client.models.webhook_data_demand_expired import WebhookDataDemandExpired as WebhookDataDemandExpired
215
+ from imzala_client.models.webhook_data_demand_expired_parties_inner import WebhookDataDemandExpiredPartiesInner as WebhookDataDemandExpiredPartiesInner
216
+ from imzala_client.models.webhook_data_party_rejected import WebhookDataPartyRejected as WebhookDataPartyRejected
217
+ from imzala_client.models.webhook_data_party_rejected_party import WebhookDataPartyRejectedParty as WebhookDataPartyRejectedParty
218
+ from imzala_client.models.webhook_data_party_signed import WebhookDataPartySigned as WebhookDataPartySigned
219
+ from imzala_client.models.webhook_data_party_viewed import WebhookDataPartyViewed as WebhookDataPartyViewed
220
+ from imzala_client.models.webhook_envelope import WebhookEnvelope as WebhookEnvelope
221
+
@@ -0,0 +1,9 @@
1
+ # flake8: noqa
2
+
3
+ # import apis into api package
4
+ from imzala_client.api.account_api import AccountApi
5
+ from imzala_client.api.demands_api import DemandsApi
6
+ from imzala_client.api.reminders_api import RemindersApi
7
+ from imzala_client.api.templates_api import TemplatesApi
8
+ from imzala_client.api.timestamps_api import TimestampsApi
9
+