svc-infra 0.1.506__py3-none-any.whl → 0.1.654__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 (202) hide show
  1. svc_infra/apf_payments/README.md +732 -0
  2. svc_infra/apf_payments/alembic.py +11 -0
  3. svc_infra/apf_payments/models.py +339 -0
  4. svc_infra/apf_payments/provider/__init__.py +4 -0
  5. svc_infra/apf_payments/provider/aiydan.py +797 -0
  6. svc_infra/apf_payments/provider/base.py +270 -0
  7. svc_infra/apf_payments/provider/registry.py +31 -0
  8. svc_infra/apf_payments/provider/stripe.py +873 -0
  9. svc_infra/apf_payments/schemas.py +333 -0
  10. svc_infra/apf_payments/service.py +892 -0
  11. svc_infra/apf_payments/settings.py +67 -0
  12. svc_infra/api/fastapi/__init__.py +6 -0
  13. svc_infra/api/fastapi/admin/__init__.py +3 -0
  14. svc_infra/api/fastapi/admin/add.py +231 -0
  15. svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  16. svc_infra/api/fastapi/apf_payments/router.py +1082 -0
  17. svc_infra/api/fastapi/apf_payments/setup.py +73 -0
  18. svc_infra/api/fastapi/auth/add.py +15 -6
  19. svc_infra/api/fastapi/auth/gaurd.py +67 -5
  20. svc_infra/api/fastapi/auth/mfa/router.py +18 -9
  21. svc_infra/api/fastapi/auth/routers/account.py +3 -2
  22. svc_infra/api/fastapi/auth/routers/apikey_router.py +11 -5
  23. svc_infra/api/fastapi/auth/routers/oauth_router.py +82 -37
  24. svc_infra/api/fastapi/auth/routers/session_router.py +63 -0
  25. svc_infra/api/fastapi/auth/security.py +3 -1
  26. svc_infra/api/fastapi/auth/settings.py +2 -0
  27. svc_infra/api/fastapi/auth/state.py +1 -1
  28. svc_infra/api/fastapi/billing/router.py +64 -0
  29. svc_infra/api/fastapi/billing/setup.py +19 -0
  30. svc_infra/api/fastapi/cache/add.py +9 -5
  31. svc_infra/api/fastapi/db/nosql/mongo/add.py +33 -27
  32. svc_infra/api/fastapi/db/sql/add.py +40 -18
  33. svc_infra/api/fastapi/db/sql/crud_router.py +176 -14
  34. svc_infra/api/fastapi/db/sql/session.py +16 -0
  35. svc_infra/api/fastapi/db/sql/users.py +14 -2
  36. svc_infra/api/fastapi/dependencies/ratelimit.py +116 -0
  37. svc_infra/api/fastapi/docs/add.py +160 -0
  38. svc_infra/api/fastapi/docs/landing.py +1 -1
  39. svc_infra/api/fastapi/docs/scoped.py +254 -0
  40. svc_infra/api/fastapi/dual/dualize.py +38 -33
  41. svc_infra/api/fastapi/dual/router.py +48 -1
  42. svc_infra/api/fastapi/dx.py +3 -3
  43. svc_infra/api/fastapi/http/__init__.py +0 -0
  44. svc_infra/api/fastapi/http/concurrency.py +14 -0
  45. svc_infra/api/fastapi/http/conditional.py +33 -0
  46. svc_infra/api/fastapi/http/deprecation.py +21 -0
  47. svc_infra/api/fastapi/middleware/errors/handlers.py +45 -7
  48. svc_infra/api/fastapi/middleware/graceful_shutdown.py +87 -0
  49. svc_infra/api/fastapi/middleware/idempotency.py +116 -0
  50. svc_infra/api/fastapi/middleware/idempotency_store.py +187 -0
  51. svc_infra/api/fastapi/middleware/optimistic_lock.py +37 -0
  52. svc_infra/api/fastapi/middleware/ratelimit.py +119 -0
  53. svc_infra/api/fastapi/middleware/ratelimit_store.py +84 -0
  54. svc_infra/api/fastapi/middleware/request_id.py +23 -0
  55. svc_infra/api/fastapi/middleware/request_size_limit.py +36 -0
  56. svc_infra/api/fastapi/middleware/timeout.py +148 -0
  57. svc_infra/api/fastapi/openapi/mutators.py +768 -55
  58. svc_infra/api/fastapi/ops/add.py +73 -0
  59. svc_infra/api/fastapi/pagination.py +363 -0
  60. svc_infra/api/fastapi/paths/auth.py +14 -14
  61. svc_infra/api/fastapi/paths/prefix.py +0 -1
  62. svc_infra/api/fastapi/paths/user.py +1 -1
  63. svc_infra/api/fastapi/routers/ping.py +1 -0
  64. svc_infra/api/fastapi/setup.py +48 -15
  65. svc_infra/api/fastapi/tenancy/add.py +19 -0
  66. svc_infra/api/fastapi/tenancy/context.py +112 -0
  67. svc_infra/api/fastapi/versioned.py +101 -0
  68. svc_infra/app/README.md +5 -5
  69. svc_infra/billing/__init__.py +23 -0
  70. svc_infra/billing/async_service.py +147 -0
  71. svc_infra/billing/jobs.py +230 -0
  72. svc_infra/billing/models.py +131 -0
  73. svc_infra/billing/quotas.py +101 -0
  74. svc_infra/billing/schemas.py +33 -0
  75. svc_infra/billing/service.py +115 -0
  76. svc_infra/bundled_docs/README.md +5 -0
  77. svc_infra/bundled_docs/__init__.py +1 -0
  78. svc_infra/bundled_docs/getting-started.md +6 -0
  79. svc_infra/cache/__init__.py +4 -0
  80. svc_infra/cache/add.py +158 -0
  81. svc_infra/cache/backend.py +5 -2
  82. svc_infra/cache/decorators.py +19 -1
  83. svc_infra/cache/keys.py +24 -4
  84. svc_infra/cli/__init__.py +32 -8
  85. svc_infra/cli/__main__.py +4 -0
  86. svc_infra/cli/cmds/__init__.py +10 -0
  87. svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +4 -3
  88. svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +4 -4
  89. svc_infra/cli/cmds/db/sql/alembic_cmds.py +120 -14
  90. svc_infra/cli/cmds/db/sql/sql_export_cmds.py +80 -0
  91. svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +5 -4
  92. svc_infra/cli/cmds/docs/docs_cmds.py +140 -0
  93. svc_infra/cli/cmds/dx/__init__.py +12 -0
  94. svc_infra/cli/cmds/dx/dx_cmds.py +99 -0
  95. svc_infra/cli/cmds/help.py +4 -0
  96. svc_infra/cli/cmds/jobs/__init__.py +1 -0
  97. svc_infra/cli/cmds/jobs/jobs_cmds.py +43 -0
  98. svc_infra/cli/cmds/obs/obs_cmds.py +4 -3
  99. svc_infra/cli/cmds/sdk/__init__.py +0 -0
  100. svc_infra/cli/cmds/sdk/sdk_cmds.py +102 -0
  101. svc_infra/data/add.py +61 -0
  102. svc_infra/data/backup.py +53 -0
  103. svc_infra/data/erasure.py +45 -0
  104. svc_infra/data/fixtures.py +40 -0
  105. svc_infra/data/retention.py +55 -0
  106. svc_infra/db/inbox.py +67 -0
  107. svc_infra/db/nosql/mongo/README.md +13 -13
  108. svc_infra/db/outbox.py +104 -0
  109. svc_infra/db/sql/apikey.py +1 -1
  110. svc_infra/db/sql/authref.py +61 -0
  111. svc_infra/db/sql/core.py +2 -2
  112. svc_infra/db/sql/repository.py +52 -12
  113. svc_infra/db/sql/resource.py +5 -0
  114. svc_infra/db/sql/scaffold.py +16 -4
  115. svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +1 -1
  116. svc_infra/db/sql/templates/setup/env_async.py.tmpl +199 -76
  117. svc_infra/db/sql/templates/setup/env_sync.py.tmpl +231 -79
  118. svc_infra/db/sql/tenant.py +79 -0
  119. svc_infra/db/sql/utils.py +18 -4
  120. svc_infra/db/sql/versioning.py +14 -0
  121. svc_infra/docs/acceptance-matrix.md +71 -0
  122. svc_infra/docs/acceptance.md +44 -0
  123. svc_infra/docs/admin.md +425 -0
  124. svc_infra/docs/adr/0002-background-jobs-and-scheduling.md +40 -0
  125. svc_infra/docs/adr/0003-webhooks-framework.md +24 -0
  126. svc_infra/docs/adr/0004-tenancy-model.md +42 -0
  127. svc_infra/docs/adr/0005-data-lifecycle.md +86 -0
  128. svc_infra/docs/adr/0006-ops-slos-and-metrics.md +47 -0
  129. svc_infra/docs/adr/0007-docs-and-sdks.md +83 -0
  130. svc_infra/docs/adr/0008-billing-primitives.md +143 -0
  131. svc_infra/docs/adr/0009-acceptance-harness.md +40 -0
  132. svc_infra/docs/adr/0010-timeouts-and-resource-limits.md +54 -0
  133. svc_infra/docs/adr/0011-admin-scope-and-impersonation.md +73 -0
  134. svc_infra/docs/api.md +59 -0
  135. svc_infra/docs/auth.md +11 -0
  136. svc_infra/docs/billing.md +190 -0
  137. svc_infra/docs/cache.md +76 -0
  138. svc_infra/docs/cli.md +74 -0
  139. svc_infra/docs/contributing.md +34 -0
  140. svc_infra/docs/data-lifecycle.md +52 -0
  141. svc_infra/docs/database.md +14 -0
  142. svc_infra/docs/docs-and-sdks.md +62 -0
  143. svc_infra/docs/environment.md +114 -0
  144. svc_infra/docs/getting-started.md +63 -0
  145. svc_infra/docs/idempotency.md +111 -0
  146. svc_infra/docs/jobs.md +67 -0
  147. svc_infra/docs/observability.md +16 -0
  148. svc_infra/docs/ops.md +37 -0
  149. svc_infra/docs/rate-limiting.md +125 -0
  150. svc_infra/docs/repo-review.md +48 -0
  151. svc_infra/docs/security.md +176 -0
  152. svc_infra/docs/tenancy.md +35 -0
  153. svc_infra/docs/timeouts-and-resource-limits.md +147 -0
  154. svc_infra/docs/versioned-integrations.md +146 -0
  155. svc_infra/docs/webhooks.md +112 -0
  156. svc_infra/dx/add.py +63 -0
  157. svc_infra/dx/changelog.py +74 -0
  158. svc_infra/dx/checks.py +67 -0
  159. svc_infra/http/__init__.py +13 -0
  160. svc_infra/http/client.py +72 -0
  161. svc_infra/jobs/builtins/outbox_processor.py +38 -0
  162. svc_infra/jobs/builtins/webhook_delivery.py +90 -0
  163. svc_infra/jobs/easy.py +32 -0
  164. svc_infra/jobs/loader.py +45 -0
  165. svc_infra/jobs/queue.py +81 -0
  166. svc_infra/jobs/redis_queue.py +191 -0
  167. svc_infra/jobs/runner.py +75 -0
  168. svc_infra/jobs/scheduler.py +41 -0
  169. svc_infra/jobs/worker.py +40 -0
  170. svc_infra/mcp/svc_infra_mcp.py +85 -28
  171. svc_infra/obs/README.md +2 -0
  172. svc_infra/obs/add.py +54 -7
  173. svc_infra/obs/grafana/dashboards/http-overview.json +45 -0
  174. svc_infra/obs/metrics/__init__.py +53 -0
  175. svc_infra/obs/metrics.py +52 -0
  176. svc_infra/security/add.py +201 -0
  177. svc_infra/security/audit.py +130 -0
  178. svc_infra/security/audit_service.py +73 -0
  179. svc_infra/security/headers.py +52 -0
  180. svc_infra/security/hibp.py +95 -0
  181. svc_infra/security/jwt_rotation.py +53 -0
  182. svc_infra/security/lockout.py +96 -0
  183. svc_infra/security/models.py +255 -0
  184. svc_infra/security/org_invites.py +128 -0
  185. svc_infra/security/passwords.py +77 -0
  186. svc_infra/security/permissions.py +149 -0
  187. svc_infra/security/session.py +98 -0
  188. svc_infra/security/signed_cookies.py +80 -0
  189. svc_infra/webhooks/__init__.py +16 -0
  190. svc_infra/webhooks/add.py +322 -0
  191. svc_infra/webhooks/fastapi.py +37 -0
  192. svc_infra/webhooks/router.py +55 -0
  193. svc_infra/webhooks/service.py +67 -0
  194. svc_infra/webhooks/signing.py +30 -0
  195. svc_infra-0.1.654.dist-info/METADATA +154 -0
  196. svc_infra-0.1.654.dist-info/RECORD +352 -0
  197. svc_infra/api/fastapi/deps.py +0 -3
  198. svc_infra-0.1.506.dist-info/METADATA +0 -78
  199. svc_infra-0.1.506.dist-info/RECORD +0 -213
  200. /svc_infra/{api/fastapi/schemas → apf_payments}/__init__.py +0 -0
  201. {svc_infra-0.1.506.dist-info → svc_infra-0.1.654.dist-info}/WHEEL +0 -0
  202. {svc_infra-0.1.506.dist-info → svc_infra-0.1.654.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,333 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Literal, Optional
4
+
5
+ from pydantic import BaseModel, Field, conint, constr
6
+
7
+ Currency = constr(pattern=r"^[A-Z]{3}$")
8
+ AmountMinor = conint(ge=0) # minor units (cents)
9
+
10
+
11
+ class CustomerUpsertIn(BaseModel):
12
+ user_id: Optional[str] = None
13
+ email: Optional[str] = None
14
+ name: Optional[str] = None
15
+
16
+
17
+ class CustomerOut(BaseModel):
18
+ id: str
19
+ provider: str
20
+ provider_customer_id: str
21
+ email: Optional[str] = None
22
+ name: Optional[str] = None
23
+
24
+
25
+ class IntentCreateIn(BaseModel):
26
+ amount: AmountMinor = Field(..., description="Minor units (e.g., cents)")
27
+ currency: Currency = Field(..., json_schema_extra={"example": "USD"})
28
+ description: Optional[str] = None
29
+ capture_method: Literal["automatic", "manual"] = "automatic"
30
+ payment_method_types: list[str] = Field(default_factory=list) # let provider default
31
+
32
+
33
+ class NextAction(BaseModel):
34
+ type: Optional[str] = None
35
+ data: Optional[dict[str, Any]] = None
36
+
37
+
38
+ class IntentOut(BaseModel):
39
+ id: str
40
+ provider: str
41
+ provider_intent_id: str
42
+ status: str
43
+ amount: AmountMinor
44
+ currency: Currency
45
+ client_secret: Optional[str] = None
46
+ next_action: Optional[NextAction] = None
47
+
48
+
49
+ class RefundIn(BaseModel):
50
+ amount: Optional[AmountMinor] = None
51
+ reason: Optional[str] = None
52
+
53
+
54
+ class TransactionRow(BaseModel):
55
+ id: str
56
+ ts: str
57
+ type: Literal["payment", "refund", "fee", "payout", "capture"]
58
+ amount: int
59
+ currency: Currency
60
+ status: str
61
+ provider: str
62
+ provider_ref: str
63
+ user_id: Optional[str] = None
64
+ net: Optional[int] = None
65
+ fee: Optional[int] = None
66
+
67
+
68
+ class StatementRow(BaseModel):
69
+ period_start: str
70
+ period_end: str
71
+ currency: Currency
72
+ gross: int
73
+ refunds: int
74
+ fees: int
75
+ net: int
76
+ count: int
77
+
78
+
79
+ class PaymentMethodAttachIn(BaseModel):
80
+ customer_provider_id: str
81
+ payment_method_token: str # provider token (e.g., stripe pm_ or payment_method id)
82
+ make_default: bool = True
83
+
84
+
85
+ class PaymentMethodOut(BaseModel):
86
+ id: str
87
+ provider: str
88
+ provider_customer_id: str
89
+ provider_method_id: str
90
+ brand: Optional[str] = None
91
+ last4: Optional[str] = None
92
+ exp_month: Optional[int] = None
93
+ exp_year: Optional[int] = None
94
+ is_default: bool = False
95
+
96
+
97
+ class ProductCreateIn(BaseModel):
98
+ name: str
99
+ active: bool = True
100
+
101
+
102
+ class ProductOut(BaseModel):
103
+ id: str
104
+ provider: str
105
+ provider_product_id: str
106
+ name: str
107
+ active: bool
108
+
109
+
110
+ class PriceCreateIn(BaseModel):
111
+ provider_product_id: str
112
+ currency: Currency
113
+ unit_amount: AmountMinor
114
+ interval: Optional[Literal["day", "week", "month", "year"]] = None
115
+ trial_days: Optional[int] = None
116
+ active: bool = True
117
+
118
+
119
+ class PriceOut(BaseModel):
120
+ id: str
121
+ provider: str
122
+ provider_price_id: str
123
+ provider_product_id: str
124
+ currency: Currency
125
+ unit_amount: AmountMinor
126
+ interval: Optional[str] = None
127
+ trial_days: Optional[int] = None
128
+ active: bool = True
129
+
130
+
131
+ class SubscriptionCreateIn(BaseModel):
132
+ customer_provider_id: str
133
+ price_provider_id: str
134
+ quantity: int = 1
135
+ trial_days: Optional[int] = None
136
+ proration_behavior: Literal["create_prorations", "none", "always_invoice"] = "create_prorations"
137
+
138
+
139
+ class SubscriptionUpdateIn(BaseModel):
140
+ price_provider_id: Optional[str] = None
141
+ quantity: Optional[int] = None
142
+ cancel_at_period_end: Optional[bool] = None
143
+ proration_behavior: Literal["create_prorations", "none", "always_invoice"] = "create_prorations"
144
+
145
+
146
+ class SubscriptionOut(BaseModel):
147
+ id: str
148
+ provider: str
149
+ provider_subscription_id: str
150
+ provider_price_id: str
151
+ status: str
152
+ quantity: int
153
+ cancel_at_period_end: bool
154
+ current_period_end: Optional[str] = None
155
+
156
+
157
+ class InvoiceCreateIn(BaseModel):
158
+ customer_provider_id: str
159
+ auto_advance: bool = True
160
+
161
+
162
+ class InvoiceOut(BaseModel):
163
+ id: str
164
+ provider: str
165
+ provider_invoice_id: str
166
+ provider_customer_id: str
167
+ status: str
168
+ amount_due: AmountMinor
169
+ currency: Currency
170
+ hosted_invoice_url: Optional[str] = None
171
+ pdf_url: Optional[str] = None
172
+
173
+
174
+ class CaptureIn(BaseModel):
175
+ amount: Optional[AmountMinor] = None # partial capture supported
176
+
177
+
178
+ class IntentListFilter(BaseModel):
179
+ customer_provider_id: Optional[str] = None
180
+ status: Optional[str] = None
181
+ limit: Optional[int] = Field(default=50, ge=1, le=200)
182
+ cursor: Optional[str] = None # opaque provider cursor when supported
183
+
184
+
185
+ class UsageRecordIn(BaseModel):
186
+ # Stripe: subscription_item is the target for metered billing.
187
+ # If provider doesn't use subscription_item, allow provider_price_id as fallback.
188
+ subscription_item: Optional[str] = None
189
+ provider_price_id: Optional[str] = None
190
+ quantity: conint(ge=0)
191
+ timestamp: Optional[int] = None # Unix seconds; provider defaults to "now"
192
+ action: Optional[Literal["increment", "set"]] = "increment"
193
+
194
+
195
+ class InvoiceLineItemIn(BaseModel):
196
+ customer_provider_id: str
197
+ description: Optional[str] = None
198
+ unit_amount: AmountMinor
199
+ currency: Currency
200
+ quantity: Optional[int] = 1
201
+ provider_price_id: Optional[str] = None # if linked to a price, unit_amount may be ignored
202
+
203
+
204
+ class InvoicesListFilter(BaseModel):
205
+ customer_provider_id: Optional[str] = None
206
+ status: Optional[str] = None
207
+ limit: Optional[int] = Field(default=50, ge=1, le=200)
208
+ cursor: Optional[str] = None
209
+
210
+
211
+ class SetupIntentOut(BaseModel):
212
+ id: str
213
+ provider: str
214
+ provider_setup_intent_id: str
215
+ status: str
216
+ client_secret: Optional[str] = None
217
+ next_action: Optional[NextAction] = None
218
+
219
+
220
+ class DisputeOut(BaseModel):
221
+ id: str
222
+ provider: str
223
+ provider_dispute_id: str
224
+ amount: AmountMinor
225
+ currency: Currency
226
+ reason: Optional[str] = None
227
+ status: str
228
+ evidence_due_by: Optional[str] = None
229
+ created_at: Optional[str] = None
230
+
231
+
232
+ class PayoutOut(BaseModel):
233
+ id: str
234
+ provider: str
235
+ provider_payout_id: str
236
+ amount: AmountMinor
237
+ currency: Currency
238
+ status: str
239
+ arrival_date: Optional[str] = None
240
+ type: Optional[str] = None
241
+
242
+
243
+ class BalanceAmount(BaseModel):
244
+ currency: Currency
245
+ amount: AmountMinor
246
+
247
+
248
+ class BalanceSnapshotOut(BaseModel):
249
+ available: list[BalanceAmount] = Field(default_factory=list)
250
+ pending: list[BalanceAmount] = Field(default_factory=list)
251
+
252
+
253
+ class SetupIntentCreateIn(BaseModel):
254
+ payment_method_types: list[str] = Field(default_factory=lambda: ["card"])
255
+
256
+
257
+ class WebhookReplayIn(BaseModel):
258
+ event_ids: Optional[list[str]] = None
259
+
260
+
261
+ class WebhookReplayOut(BaseModel):
262
+ replayed: int
263
+
264
+
265
+ class WebhookAckOut(BaseModel):
266
+ ok: bool
267
+
268
+
269
+ class UsageRecordOut(BaseModel):
270
+ id: str
271
+ quantity: int
272
+ timestamp: Optional[int] = None
273
+ subscription_item: Optional[str] = None
274
+ provider_price_id: Optional[str] = None
275
+ action: Optional[Literal["increment", "set"]] = None
276
+
277
+
278
+ # -------- Customers list filter ----------
279
+ class CustomersListFilter(BaseModel):
280
+ provider: Optional[str] = None
281
+ user_id: Optional[str] = None
282
+ limit: Optional[int] = Field(default=50, ge=1, le=200)
283
+ cursor: Optional[str] = None # we’ll paginate on provider_customer_id asc
284
+
285
+
286
+ # -------- Products / Prices updates ----------
287
+ class ProductUpdateIn(BaseModel):
288
+ name: Optional[str] = None
289
+ active: Optional[bool] = None
290
+
291
+
292
+ class PriceUpdateIn(BaseModel):
293
+ active: Optional[bool] = None
294
+
295
+
296
+ # -------- Payment Method update ----------
297
+ class PaymentMethodUpdateIn(BaseModel):
298
+ # keep minimal + commonly supported card fields
299
+ name: Optional[str] = None
300
+ exp_month: Optional[int] = None
301
+ exp_year: Optional[int] = None
302
+ # extend here later with address fields (line1, city, etc.)
303
+
304
+
305
+ # -------- Refunds (list/get) ----------
306
+ class RefundOut(BaseModel):
307
+ id: str
308
+ provider: str
309
+ provider_refund_id: str
310
+ provider_payment_intent_id: Optional[str] = None
311
+ amount: AmountMinor
312
+ currency: Currency
313
+ status: str
314
+ reason: Optional[str] = None
315
+ created_at: Optional[str] = None
316
+
317
+
318
+ # -------- Invoice line items (list) ----------
319
+ class InvoiceLineItemOut(BaseModel):
320
+ id: str
321
+ description: Optional[str] = None
322
+ amount: AmountMinor
323
+ currency: Currency
324
+ quantity: Optional[int] = 1
325
+ provider_price_id: Optional[str] = None
326
+
327
+
328
+ # -------- Usage records list/get ----------
329
+ class UsageRecordListFilter(BaseModel):
330
+ subscription_item: Optional[str] = None
331
+ provider_price_id: Optional[str] = None
332
+ limit: Optional[int] = Field(default=50, ge=1, le=200)
333
+ cursor: Optional[str] = None