ffid-python-sdk 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 (38) hide show
  1. ffid_python_sdk-0.1.0/.coverage +0 -0
  2. ffid_python_sdk-0.1.0/.gitignore +98 -0
  3. ffid_python_sdk-0.1.0/.gitkeep +2 -0
  4. ffid_python_sdk-0.1.0/LICENSE +21 -0
  5. ffid_python_sdk-0.1.0/PKG-INFO +135 -0
  6. ffid_python_sdk-0.1.0/README.md +100 -0
  7. ffid_python_sdk-0.1.0/ffid_sdk/__init__.py +176 -0
  8. ffid_python_sdk-0.1.0/ffid_sdk/client.py +394 -0
  9. ffid_python_sdk-0.1.0/ffid_sdk/constants.py +75 -0
  10. ffid_python_sdk-0.1.0/ffid_sdk/context.py +75 -0
  11. ffid_python_sdk-0.1.0/ffid_sdk/decorators.py +147 -0
  12. ffid_python_sdk-0.1.0/ffid_sdk/errors.py +153 -0
  13. ffid_python_sdk-0.1.0/ffid_sdk/legal/__init__.py +53 -0
  14. ffid_python_sdk-0.1.0/ffid_sdk/legal/client.py +224 -0
  15. ffid_python_sdk-0.1.0/ffid_sdk/legal/errors.py +55 -0
  16. ffid_python_sdk-0.1.0/ffid_sdk/legal/helpers.py +55 -0
  17. ffid_python_sdk-0.1.0/ffid_sdk/legal/types.py +145 -0
  18. ffid_python_sdk-0.1.0/ffid_sdk/middleware.py +240 -0
  19. ffid_python_sdk-0.1.0/ffid_sdk/types.py +257 -0
  20. ffid_python_sdk-0.1.0/ffid_sdk/webhook_constants.py +34 -0
  21. ffid_python_sdk-0.1.0/ffid_sdk/webhook_errors.py +63 -0
  22. ffid_python_sdk-0.1.0/ffid_sdk/webhook_handler.py +213 -0
  23. ffid_python_sdk-0.1.0/ffid_sdk/webhook_types.py +212 -0
  24. ffid_python_sdk-0.1.0/ffid_sdk/webhook_verify.py +136 -0
  25. ffid_python_sdk-0.1.0/pyproject.toml +68 -0
  26. ffid_python_sdk-0.1.0/tests/__init__.py +0 -0
  27. ffid_python_sdk-0.1.0/tests/conftest.py +196 -0
  28. ffid_python_sdk-0.1.0/tests/integration/test_connection.py +54 -0
  29. ffid_python_sdk-0.1.0/tests/test_client.py +467 -0
  30. ffid_python_sdk-0.1.0/tests/test_context.py +88 -0
  31. ffid_python_sdk-0.1.0/tests/test_decorators.py +185 -0
  32. ffid_python_sdk-0.1.0/tests/test_legal_client.py +323 -0
  33. ffid_python_sdk-0.1.0/tests/test_legal_helpers.py +125 -0
  34. ffid_python_sdk-0.1.0/tests/test_middleware.py +283 -0
  35. ffid_python_sdk-0.1.0/tests/test_types.py +366 -0
  36. ffid_python_sdk-0.1.0/tests/test_webhook_handler.py +390 -0
  37. ffid_python_sdk-0.1.0/tests/test_webhook_verify.py +250 -0
  38. ffid_python_sdk-0.1.0/uv.lock +700 -0
Binary file
@@ -0,0 +1,98 @@
1
+ # FeelFlow ID Platform - Git Ignore
2
+
3
+ # Dependencies
4
+ node_modules/
5
+ .pnp/
6
+ .pnp.js
7
+ .yarn/
8
+
9
+ # Build outputs
10
+ .next/
11
+ out/
12
+ dist/
13
+ build/
14
+
15
+ # Environment variables
16
+ .env
17
+ .env.local
18
+ .env.*.local
19
+ .env.development.local
20
+ .env.test.local
21
+ .env.production.local
22
+
23
+ # Debug logs
24
+ npm-debug.log*
25
+ yarn-debug.log*
26
+ yarn-error.log*
27
+ .pnpm-debug.log*
28
+
29
+ # Testing
30
+ coverage/
31
+ *.lcov
32
+ .nyc_output/
33
+
34
+ # TypeScript
35
+ *.tsbuildinfo
36
+ next-env.d.ts
37
+
38
+ # IDE
39
+ .idea/
40
+ .vscode/
41
+ *.swp
42
+ *.swo
43
+ *~
44
+ .project
45
+ .classpath
46
+ .settings/
47
+
48
+ # OS
49
+ .DS_Store
50
+ .DS_Store?
51
+ ._*
52
+ .Spotlight-V100
53
+ .Trashes
54
+ ehthumbs.db
55
+ Thumbs.db
56
+
57
+ # Logs
58
+ logs/
59
+ *.log
60
+
61
+ # Temporary files
62
+ tmp/
63
+ temp/
64
+ *.tmp
65
+ *.temp
66
+
67
+ # Vercel
68
+ .vercel/
69
+
70
+ # Turbopack
71
+ .turbo/
72
+
73
+ # Claude Code local settings
74
+ .claude/settings.local.json
75
+ # Cursor / Claude Code plan files
76
+ .claude/plans/
77
+ # Cursor: ignore .cursor except skills (project-specific, shared with team)
78
+ .cursor/*
79
+ !.cursor/skills/
80
+
81
+ # SDK build outputs (for sdk/ directory)
82
+ sdk/python/dist/
83
+ sdk/python/*.egg-info/
84
+ sdk/typescript/dist/
85
+ sdk/typescript/node_modules/
86
+
87
+ # Python cache
88
+ __pycache__/
89
+ *.py[cod]
90
+ *$py.class
91
+ .pytest_cache/
92
+
93
+ # Distribution packages
94
+ *.zip
95
+
96
+ # Test data (local only, not committed)
97
+ supabase/tests/*.local.md
98
+ supabase/tests/test-data.local.json
@@ -0,0 +1,2 @@
1
+ # ffid-python-sdk
2
+ # Python SDK for connecting services to FeelFlow ID Platform
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FeelFlow Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,135 @@
1
+ Metadata-Version: 2.4
2
+ Name: ffid-python-sdk
3
+ Version: 0.1.0
4
+ Summary: FeelFlow ID Platform SDK for Python (FastAPI)
5
+ Project-URL: Homepage, https://github.com/feel-flow/feelflow-id-platform/tree/develop/sdk/python
6
+ Project-URL: Repository, https://github.com/feel-flow/feelflow-id-platform
7
+ Project-URL: Documentation, https://github.com/feel-flow/feelflow-id-platform/tree/develop/sdk/python#readme
8
+ Project-URL: Bug Tracker, https://github.com/feel-flow/feelflow-id-platform/issues
9
+ Author-email: "FeelFlow Inc." <dev@feelflow.co.jp>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: authentication,fastapi,feelflow,ffid,sdk
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Framework :: FastAPI
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: fastapi>=0.100.0
24
+ Requires-Dist: httpx>=0.24.0
25
+ Requires-Dist: pydantic>=2.0.0
26
+ Requires-Dist: typing-extensions>=4.0.0
27
+ Provides-Extra: dev
28
+ Requires-Dist: mypy>=1.0.0; extra == 'dev'
29
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
30
+ Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
31
+ Requires-Dist: pytest>=7.0.0; extra == 'dev'
32
+ Requires-Dist: respx>=0.20.0; extra == 'dev'
33
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
34
+ Description-Content-Type: text/markdown
35
+
36
+ # ffid-python-sdk
37
+
38
+ FeelFlow ID Platform SDK for Python (FastAPI).
39
+ FastAPI アプリケーション向けの認証・認可・契約管理 SDK です。
40
+
41
+ **5行のコードでFFID認証を導入可能**(最小ボイラープレート)。
42
+
43
+ - Python 3.11+
44
+ - FastAPI / Pydantic v2 / httpx
45
+
46
+ ## インストール
47
+
48
+ ```bash
49
+ pip install ffid-python-sdk
50
+ ```
51
+
52
+ ## クイックスタート(最小例)
53
+
54
+ ```python
55
+ from fastapi import FastAPI, Depends
56
+ from ffid_sdk import FFIDMiddleware, require_subscription, FFIDContext, get_ffid_context
57
+
58
+ app = FastAPI()
59
+ app.add_middleware(FFIDMiddleware, service_code="chatbot")
60
+
61
+ @app.get("/api/chat")
62
+ @require_subscription(plan=["basic", "pro", "enterprise"])
63
+ async def chat(ffid: FFIDContext = Depends(get_ffid_context)):
64
+ return {"message": f"Hello, {ffid.user.email}"}
65
+ ```
66
+
67
+ 認証はミドルウェアが行い、`get_ffid_context` でコンテキストをエンドポイントに注入します。
68
+ `plan=` は `plans=` のエイリアスです(どちらも利用可能)。
69
+
70
+ ## 主要コンポーネント
71
+
72
+ ### FFIDMiddleware
73
+
74
+ リクエストからアクセストークン(`Authorization: Bearer` または Cookie `ffid_session`)を取得し、FFID API でセッション検証後に `request.state.ffid_context` にコンテキストを格納します。
75
+
76
+ ```python
77
+ app.add_middleware(
78
+ FFIDMiddleware,
79
+ service_code="chatbot",
80
+ exclude_paths=["/health", "/docs", "/openapi.json"],
81
+ )
82
+ ```
83
+
84
+ ### FFIDContext
85
+
86
+ ユーザー・組織・契約情報を保持するリクエストスコープのコンテキスト。
87
+ `Depends(get_ffid_context)` で取得(認証任意)、`Depends(require_ffid_auth)` で認証必須にできます。
88
+
89
+ - `ctx.user` … 認証ユーザー
90
+ - `ctx.organizations` … 所属組織一覧
91
+ - `ctx.subscriptions` … 契約一覧
92
+ - `ctx.active_subscription` … 有効な契約(1件)
93
+
94
+ ### @require_subscription
95
+
96
+ 契約チェック用デコレータ。指定プランまたは任意の有効契約が必要なエンドポイントに付けます。
97
+
98
+ ```python
99
+ @require_subscription(plan=["basic", "pro", "enterprise"]) # または plans=
100
+ async def premium(ctx: FFIDContext = Depends(get_ffid_context)):
101
+ ...
102
+ ```
103
+
104
+ ### FFIDClient
105
+
106
+ FFID API を直接呼ぶクライアント(セッション取得・トークンリフレッシュ・サインアウト・契約確認など)。
107
+ ミドルウェアを使わないバックグラウンド処理やテストで利用します。
108
+
109
+ ```python
110
+ from ffid_sdk import FFIDClient, FFIDConfig
111
+
112
+ client = FFIDClient(FFIDConfig(service_code="chatbot"))
113
+ response = await client.get_session(token="...")
114
+ ```
115
+
116
+ ## 環境変数
117
+
118
+ | 変数 | 説明 |
119
+ |------|------|
120
+ | `FFID_SERVICE_CODE` | サービス識別コード(例: `chatbot`)。ミドルウェアの `service_code` に渡すか、クライアント設定で指定。 |
121
+ | `FFID_API_BASE_URL` | FFID API のベースURL(省略時は本番 `https://id.feelflow.co.jp` 相当)。 |
122
+
123
+ ## 利用規約チェック・リダイレクト
124
+
125
+ 法的文書の同意確認と未同意時のリダイレクトは、Legal クライアント(Service API Key 認証)で実装済みです。
126
+ `check_pending_agreements_and_redirect_url` で未同意一覧を取得し、未同意時は返却される `redirect_url` へリダイレクトできます。戻り値の第4要素に API エラーが入るため、呼び出し元でエラーハンドリング可能です。
127
+
128
+ ## トークン自動リフレッシュ(オプション)
129
+
130
+ JWT 期限切れ時に refresh トークンで自動再取得する機能をミドルウェアで利用できます。
131
+ `FFIDMiddleware(..., auto_refresh=True)` にし、Cookie `ffid_refresh` にリフレッシュトークンが含まれる構成で有効化します。
132
+
133
+ ## ライセンス
134
+
135
+ MIT
@@ -0,0 +1,100 @@
1
+ # ffid-python-sdk
2
+
3
+ FeelFlow ID Platform SDK for Python (FastAPI).
4
+ FastAPI アプリケーション向けの認証・認可・契約管理 SDK です。
5
+
6
+ **5行のコードでFFID認証を導入可能**(最小ボイラープレート)。
7
+
8
+ - Python 3.11+
9
+ - FastAPI / Pydantic v2 / httpx
10
+
11
+ ## インストール
12
+
13
+ ```bash
14
+ pip install ffid-python-sdk
15
+ ```
16
+
17
+ ## クイックスタート(最小例)
18
+
19
+ ```python
20
+ from fastapi import FastAPI, Depends
21
+ from ffid_sdk import FFIDMiddleware, require_subscription, FFIDContext, get_ffid_context
22
+
23
+ app = FastAPI()
24
+ app.add_middleware(FFIDMiddleware, service_code="chatbot")
25
+
26
+ @app.get("/api/chat")
27
+ @require_subscription(plan=["basic", "pro", "enterprise"])
28
+ async def chat(ffid: FFIDContext = Depends(get_ffid_context)):
29
+ return {"message": f"Hello, {ffid.user.email}"}
30
+ ```
31
+
32
+ 認証はミドルウェアが行い、`get_ffid_context` でコンテキストをエンドポイントに注入します。
33
+ `plan=` は `plans=` のエイリアスです(どちらも利用可能)。
34
+
35
+ ## 主要コンポーネント
36
+
37
+ ### FFIDMiddleware
38
+
39
+ リクエストからアクセストークン(`Authorization: Bearer` または Cookie `ffid_session`)を取得し、FFID API でセッション検証後に `request.state.ffid_context` にコンテキストを格納します。
40
+
41
+ ```python
42
+ app.add_middleware(
43
+ FFIDMiddleware,
44
+ service_code="chatbot",
45
+ exclude_paths=["/health", "/docs", "/openapi.json"],
46
+ )
47
+ ```
48
+
49
+ ### FFIDContext
50
+
51
+ ユーザー・組織・契約情報を保持するリクエストスコープのコンテキスト。
52
+ `Depends(get_ffid_context)` で取得(認証任意)、`Depends(require_ffid_auth)` で認証必須にできます。
53
+
54
+ - `ctx.user` … 認証ユーザー
55
+ - `ctx.organizations` … 所属組織一覧
56
+ - `ctx.subscriptions` … 契約一覧
57
+ - `ctx.active_subscription` … 有効な契約(1件)
58
+
59
+ ### @require_subscription
60
+
61
+ 契約チェック用デコレータ。指定プランまたは任意の有効契約が必要なエンドポイントに付けます。
62
+
63
+ ```python
64
+ @require_subscription(plan=["basic", "pro", "enterprise"]) # または plans=
65
+ async def premium(ctx: FFIDContext = Depends(get_ffid_context)):
66
+ ...
67
+ ```
68
+
69
+ ### FFIDClient
70
+
71
+ FFID API を直接呼ぶクライアント(セッション取得・トークンリフレッシュ・サインアウト・契約確認など)。
72
+ ミドルウェアを使わないバックグラウンド処理やテストで利用します。
73
+
74
+ ```python
75
+ from ffid_sdk import FFIDClient, FFIDConfig
76
+
77
+ client = FFIDClient(FFIDConfig(service_code="chatbot"))
78
+ response = await client.get_session(token="...")
79
+ ```
80
+
81
+ ## 環境変数
82
+
83
+ | 変数 | 説明 |
84
+ |------|------|
85
+ | `FFID_SERVICE_CODE` | サービス識別コード(例: `chatbot`)。ミドルウェアの `service_code` に渡すか、クライアント設定で指定。 |
86
+ | `FFID_API_BASE_URL` | FFID API のベースURL(省略時は本番 `https://id.feelflow.co.jp` 相当)。 |
87
+
88
+ ## 利用規約チェック・リダイレクト
89
+
90
+ 法的文書の同意確認と未同意時のリダイレクトは、Legal クライアント(Service API Key 認証)で実装済みです。
91
+ `check_pending_agreements_and_redirect_url` で未同意一覧を取得し、未同意時は返却される `redirect_url` へリダイレクトできます。戻り値の第4要素に API エラーが入るため、呼び出し元でエラーハンドリング可能です。
92
+
93
+ ## トークン自動リフレッシュ(オプション)
94
+
95
+ JWT 期限切れ時に refresh トークンで自動再取得する機能をミドルウェアで利用できます。
96
+ `FFIDMiddleware(..., auto_refresh=True)` にし、Cookie `ffid_refresh` にリフレッシュトークンが含まれる構成で有効化します。
97
+
98
+ ## ライセンス
99
+
100
+ MIT
@@ -0,0 +1,176 @@
1
+ """
2
+ FFID SDK - FeelFlow ID Platform SDK for Python (FastAPI)
3
+
4
+ FastAPI アプリケーション向けの認証・認可・契約管理 SDK。
5
+
6
+ Quick Start:
7
+ ```python
8
+ from fastapi import FastAPI, Depends
9
+ from ffid_sdk import FFIDMiddleware, FFIDContext, get_ffid_context, require_subscription
10
+
11
+ app = FastAPI()
12
+ app.add_middleware(FFIDMiddleware, service_code="chatbot")
13
+
14
+ @app.get("/dashboard")
15
+ async def dashboard(ctx: FFIDContext = Depends(get_ffid_context)):
16
+ return {"user": ctx.user.email}
17
+
18
+ @app.get("/premium")
19
+ @require_subscription(plans=["pro", "enterprise"])
20
+ async def premium(ctx: FFIDContext = Depends(get_ffid_context)):
21
+ return {"plan": ctx.active_subscription.plan_code}
22
+ ```
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ # Client
28
+ from ffid_sdk.client import FFIDClient
29
+
30
+ # Constants
31
+ from ffid_sdk.constants import DEFAULT_API_BASE_URL
32
+
33
+ # Context & Dependencies
34
+ from ffid_sdk.context import get_ffid_context, require_ffid_auth
35
+
36
+ # Decorators
37
+ from ffid_sdk.decorators import require_subscription
38
+
39
+ # Errors
40
+ from ffid_sdk.errors import (
41
+ FFIDAuthenticationError,
42
+ FFIDAuthorizationError,
43
+ FFIDErrorCode,
44
+ FFIDNetworkError,
45
+ FFIDSDKError,
46
+ FFIDSubscriptionError,
47
+ FFIDValidationError,
48
+ )
49
+
50
+ # Middleware
51
+ from ffid_sdk.middleware import FFIDMiddleware
52
+
53
+ # Types
54
+ from ffid_sdk.types import (
55
+ FFIDApiResponse,
56
+ FFIDConfig,
57
+ FFIDContext,
58
+ FFIDError,
59
+ FFIDOrganization,
60
+ FFIDSessionResponse,
61
+ FFIDSubscription,
62
+ FFIDTokenResponse,
63
+ FFIDUser,
64
+ MembershipStatus,
65
+ OrganizationRole,
66
+ SubscriptionStatus,
67
+ )
68
+
69
+ # Webhook - Constants
70
+ from ffid_sdk.webhook_constants import (
71
+ DEFAULT_TOLERANCE_SECONDS,
72
+ FFID_WEBHOOK_EVENT_ID_HEADER,
73
+ FFID_WEBHOOK_SIGNATURE_HEADER,
74
+ FFID_WEBHOOK_TIMESTAMP_HEADER,
75
+ )
76
+
77
+ # Webhook - Errors
78
+ from ffid_sdk.webhook_errors import (
79
+ FFIDWebhookError,
80
+ FFIDWebhookPayloadError,
81
+ FFIDWebhookSignatureError,
82
+ FFIDWebhookTimestampError,
83
+ )
84
+
85
+ # Webhook - Handler
86
+ from ffid_sdk.webhook_handler import WebhookHandler
87
+
88
+ # Webhook - Types
89
+ from ffid_sdk.webhook_types import (
90
+ EVENT_TYPE_PAYLOAD_MAP,
91
+ FFIDLegalDocumentPayload,
92
+ FFIDMaintenancePayload,
93
+ FFIDOrganizationMemberPayload,
94
+ FFIDOrganizationPayload,
95
+ FFIDSubscriptionPayload,
96
+ FFIDTestPingPayload,
97
+ FFIDUserPayload,
98
+ FFIDWebhookEvent,
99
+ WebhookEventType,
100
+ )
101
+
102
+ # Webhook - Verify
103
+ from ffid_sdk.webhook_verify import verify_webhook_signature
104
+
105
+ # Legal (Phase 2: 利用規約チェック・リダイレクト)
106
+ from ffid_sdk.legal import (
107
+ FFIDLegalClient,
108
+ FFIDLegalClientConfig,
109
+ check_pending_agreements_and_redirect_url,
110
+ )
111
+
112
+ __all__ = [
113
+ # Client
114
+ "FFIDClient",
115
+ # Config & Constants
116
+ "FFIDConfig",
117
+ "DEFAULT_API_BASE_URL",
118
+ # Context & Dependencies
119
+ "FFIDContext",
120
+ "get_ffid_context",
121
+ "require_ffid_auth",
122
+ # Decorators
123
+ "require_subscription",
124
+ # Errors
125
+ "FFIDSDKError",
126
+ "FFIDAuthenticationError",
127
+ "FFIDAuthorizationError",
128
+ "FFIDSubscriptionError",
129
+ "FFIDNetworkError",
130
+ "FFIDValidationError",
131
+ "FFIDErrorCode",
132
+ # Middleware
133
+ "FFIDMiddleware",
134
+ # Types
135
+ "FFIDUser",
136
+ "FFIDOrganization",
137
+ "FFIDSubscription",
138
+ "FFIDSessionResponse",
139
+ "FFIDTokenResponse",
140
+ "FFIDError",
141
+ "FFIDApiResponse",
142
+ "OrganizationRole",
143
+ "MembershipStatus",
144
+ "SubscriptionStatus",
145
+ # Webhook - Constants
146
+ "FFID_WEBHOOK_SIGNATURE_HEADER",
147
+ "FFID_WEBHOOK_TIMESTAMP_HEADER",
148
+ "FFID_WEBHOOK_EVENT_ID_HEADER",
149
+ "DEFAULT_TOLERANCE_SECONDS",
150
+ # Webhook - Errors
151
+ "FFIDWebhookError",
152
+ "FFIDWebhookSignatureError",
153
+ "FFIDWebhookTimestampError",
154
+ "FFIDWebhookPayloadError",
155
+ # Webhook - Handler
156
+ "WebhookHandler",
157
+ # Webhook - Types
158
+ "FFIDWebhookEvent",
159
+ "WebhookEventType",
160
+ "FFIDSubscriptionPayload",
161
+ "FFIDUserPayload",
162
+ "FFIDOrganizationPayload",
163
+ "FFIDOrganizationMemberPayload",
164
+ "FFIDLegalDocumentPayload",
165
+ "FFIDMaintenancePayload",
166
+ "FFIDTestPingPayload",
167
+ "EVENT_TYPE_PAYLOAD_MAP",
168
+ # Webhook - Verify
169
+ "verify_webhook_signature",
170
+ # Legal
171
+ "FFIDLegalClient",
172
+ "FFIDLegalClientConfig",
173
+ "check_pending_agreements_and_redirect_url",
174
+ ]
175
+
176
+ __version__ = "0.1.0"