solvapay 0.1.0.dev4__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.
@@ -0,0 +1,1894 @@
1
+ """GENERATED by python/scripts/generate_client.py from openapi/sdk-v1.json. Do not edit."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from .._http import AsyncTransport, SyncTransport, encode_body, path_segment
8
+ from . import models
9
+
10
+
11
+ class AsyncSolvaPayApi:
12
+ """Every SolvaPay API operation, async: one method per operation."""
13
+
14
+ def __init__(self, transport: AsyncTransport) -> None:
15
+ self._transport = transport
16
+
17
+ async def activate_plan(
18
+ self,
19
+ *,
20
+ body: models.ActivatePlanDto | dict[str, Any],
21
+ ) -> models.ActivatePlanResponseDto:
22
+ """Activate a plan for a customer
23
+
24
+ POST /v1/sdk/activate"""
25
+ data = await self._transport.request(
26
+ "POST",
27
+ f"/v1/sdk/activate",
28
+ query={},
29
+ headers={},
30
+ body=encode_body(body),
31
+ )
32
+ return self._transport.parse(models.ActivatePlanResponseDto, data)
33
+
34
+ async def authorize_agent_call(
35
+ self,
36
+ *,
37
+ body: models.AuthorizeCallDto | dict[str, Any],
38
+ ) -> models.AuthorizeCallResponseDto:
39
+ """Authorize a paid agent call: the customer, the agent's spend policy and the estimate held against budget and balance
40
+
41
+ POST /v1/sdk/agent/calls"""
42
+ data = await self._transport.request(
43
+ "POST",
44
+ f"/v1/sdk/agent/calls",
45
+ query={},
46
+ headers={},
47
+ body=encode_body(body),
48
+ )
49
+ return self._transport.parse(models.AuthorizeCallResponseDto, data)
50
+
51
+ async def complete_agent_call(
52
+ self,
53
+ *,
54
+ call_ref: str,
55
+ body: models.CompleteCallDto | dict[str, Any],
56
+ ) -> models.CompleteCallResponseDto:
57
+ """Complete an allowed agent call: settle the spend policy and debit the call's customer at the reported cost
58
+
59
+ POST /v1/sdk/agent/calls/{callRef}/complete"""
60
+ data = await self._transport.request(
61
+ "POST",
62
+ f"/v1/sdk/agent/calls/{path_segment(call_ref)}/complete",
63
+ query={},
64
+ headers={},
65
+ body=encode_body(body),
66
+ )
67
+ return self._transport.parse(models.CompleteCallResponseDto, data)
68
+
69
+ async def verify_agent_key(
70
+ self,
71
+ *,
72
+ body: models.VerifyAgentKeyDto | dict[str, Any],
73
+ ) -> models.VerifiedAgentKeyResponseDto:
74
+ """Read the agent behind an agent key issued for this merchant
75
+
76
+ POST /v1/sdk/agent/keys/verifications"""
77
+ data = await self._transport.request(
78
+ "POST",
79
+ f"/v1/sdk/agent/keys/verifications",
80
+ query={},
81
+ headers={},
82
+ body=encode_body(body),
83
+ )
84
+ return self._transport.parse(models.VerifiedAgentKeyResponseDto, data)
85
+
86
+ async def report_agent_usage(
87
+ self,
88
+ *,
89
+ body: models.UsageReportDto | dict[str, Any],
90
+ ) -> models.UsageReportResponseDto:
91
+ """Report the merchant's own cost of each decided agent call; SolvaPay corrects the spend policy and the credits to it
92
+
93
+ POST /v1/sdk/agent/usage-reports"""
94
+ data = await self._transport.request(
95
+ "POST",
96
+ f"/v1/sdk/agent/usage-reports",
97
+ query={},
98
+ headers={},
99
+ body=encode_body(body),
100
+ )
101
+ return self._transport.parse(models.UsageReportResponseDto, data)
102
+
103
+ async def disable_auto_recharge(
104
+ self,
105
+ *,
106
+ customer_ref: str,
107
+ ) -> models.DisableAutoRechargeResponse:
108
+ """Disable auto-recharge for a customer
109
+
110
+ DELETE /v1/sdk/auto-recharge"""
111
+ data = await self._transport.request(
112
+ "DELETE",
113
+ f"/v1/sdk/auto-recharge",
114
+ query={"customerRef": customer_ref},
115
+ headers={},
116
+ body=None,
117
+ )
118
+ return self._transport.parse(models.DisableAutoRechargeResponse, data)
119
+
120
+ async def get_auto_recharge(
121
+ self,
122
+ *,
123
+ customer_ref: str,
124
+ ) -> models.AutoRechargeGetResponse:
125
+ """Get auto-recharge config for a customer
126
+
127
+ GET /v1/sdk/auto-recharge"""
128
+ data = await self._transport.request(
129
+ "GET",
130
+ f"/v1/sdk/auto-recharge",
131
+ query={"customerRef": customer_ref},
132
+ headers={},
133
+ body=None,
134
+ )
135
+ return self._transport.parse(models.AutoRechargeGetResponse, data)
136
+
137
+ async def save_auto_recharge(
138
+ self,
139
+ *,
140
+ body: models.PutAutoRechargeSdkDto | dict[str, Any],
141
+ ) -> models.SaveAutoRechargeResponse:
142
+ """Set or update auto-recharge config for a customer
143
+
144
+ PUT /v1/sdk/auto-recharge"""
145
+ data = await self._transport.request(
146
+ "PUT",
147
+ f"/v1/sdk/auto-recharge",
148
+ query={},
149
+ headers={},
150
+ body=encode_body(body),
151
+ )
152
+ return self._transport.parse(models.SaveAutoRechargeResponse, data)
153
+
154
+ async def create_checkout_session(
155
+ self,
156
+ *,
157
+ body: models.CreateCheckoutSessionRequest | dict[str, Any],
158
+ ) -> models.CreateCheckoutSessionResponse:
159
+ """Create a checkout session
160
+
161
+ POST /v1/sdk/checkout-sessions"""
162
+ data = await self._transport.request(
163
+ "POST",
164
+ f"/v1/sdk/checkout-sessions",
165
+ query={},
166
+ headers={},
167
+ body=encode_body(body),
168
+ )
169
+ return self._transport.parse(models.CreateCheckoutSessionResponse, data)
170
+
171
+ async def get_credit_activity(
172
+ self,
173
+ *,
174
+ customer_ref: str,
175
+ limit: float | None = None,
176
+ ) -> models.CreditActivityResponseDto:
177
+ """List account-wide credit activity for a customer
178
+
179
+ GET /v1/sdk/credits/activity"""
180
+ data = await self._transport.request(
181
+ "GET",
182
+ f"/v1/sdk/credits/activity",
183
+ query={"customerRef": customer_ref, "limit": limit},
184
+ headers={},
185
+ body=None,
186
+ )
187
+ return self._transport.parse(models.CreditActivityResponseDto, data)
188
+
189
+ async def get_customer_by_query(
190
+ self,
191
+ *,
192
+ reference: str | None = None,
193
+ external_ref: str | None = None,
194
+ email: str | None = None,
195
+ ) -> models.CustomerResponse:
196
+ """Get customer by reference, externalRef, or email
197
+
198
+ GET /v1/sdk/customers"""
199
+ data = await self._transport.request(
200
+ "GET",
201
+ f"/v1/sdk/customers",
202
+ query={"reference": reference, "externalRef": external_ref, "email": email},
203
+ headers={},
204
+ body=None,
205
+ )
206
+ return self._transport.parse(models.CustomerResponse, data)
207
+
208
+ async def create_customer(
209
+ self,
210
+ *,
211
+ body: models.CreateCustomerRequest | dict[str, Any],
212
+ ) -> models.CustomerResponse:
213
+ """Create a new customer
214
+
215
+ POST /v1/sdk/customers"""
216
+ data = await self._transport.request(
217
+ "POST",
218
+ f"/v1/sdk/customers",
219
+ query={},
220
+ headers={},
221
+ body=encode_body(body),
222
+ )
223
+ return self._transport.parse(models.CustomerResponse, data)
224
+
225
+ async def create_customer_session(
226
+ self,
227
+ *,
228
+ body: models.CreateCustomerSessionRequest | dict[str, Any],
229
+ ) -> models.CreateCustomerSessionResponse:
230
+ """Create a customer session
231
+
232
+ POST /v1/sdk/customers/customer-sessions"""
233
+ data = await self._transport.request(
234
+ "POST",
235
+ f"/v1/sdk/customers/customer-sessions",
236
+ query={},
237
+ headers={},
238
+ body=encode_body(body),
239
+ )
240
+ return self._transport.parse(models.CreateCustomerSessionResponse, data)
241
+
242
+ async def get_customer_session(
243
+ self,
244
+ *,
245
+ session_id: str,
246
+ ) -> models.GetCustomerSessionResponse:
247
+ """Get customer session by sessionId
248
+
249
+ GET /v1/sdk/customers/customer-sessions/{sessionId}"""
250
+ data = await self._transport.request(
251
+ "GET",
252
+ f"/v1/sdk/customers/customer-sessions/{path_segment(session_id)}",
253
+ query={},
254
+ headers={},
255
+ body=None,
256
+ )
257
+ return self._transport.parse(models.GetCustomerSessionResponse, data)
258
+
259
+ async def get_customer(
260
+ self,
261
+ *,
262
+ reference: str,
263
+ ) -> models.CustomerResponse:
264
+ """Get customer by reference
265
+
266
+ GET /v1/sdk/customers/{reference}"""
267
+ data = await self._transport.request(
268
+ "GET",
269
+ f"/v1/sdk/customers/{path_segment(reference)}",
270
+ query={},
271
+ headers={},
272
+ body=None,
273
+ )
274
+ return self._transport.parse(models.CustomerResponse, data)
275
+
276
+ async def update_customer(
277
+ self,
278
+ *,
279
+ reference: str,
280
+ body: models.UpdateCustomerRequest | dict[str, Any],
281
+ ) -> models.CustomerResponse:
282
+ """Update a customer
283
+
284
+ PATCH /v1/sdk/customers/{reference}"""
285
+ data = await self._transport.request(
286
+ "PATCH",
287
+ f"/v1/sdk/customers/{path_segment(reference)}",
288
+ query={},
289
+ headers={},
290
+ body=encode_body(body),
291
+ )
292
+ return self._transport.parse(models.CustomerResponse, data)
293
+
294
+ async def get_customer_balance(
295
+ self,
296
+ *,
297
+ reference: str,
298
+ ) -> models.CustomerBalanceResponse:
299
+ """Get customer credit balance
300
+
301
+ GET /v1/sdk/customers/{reference}/balance"""
302
+ data = await self._transport.request(
303
+ "GET",
304
+ f"/v1/sdk/customers/{path_segment(reference)}/balance",
305
+ query={},
306
+ headers={},
307
+ body=None,
308
+ )
309
+ return self._transport.parse(models.CustomerBalanceResponse, data)
310
+
311
+ async def grant_credits(
312
+ self,
313
+ *,
314
+ reference: str,
315
+ body: models.GrantCustomerCreditsRequest | dict[str, Any],
316
+ idempotency_key: str | None = None,
317
+ ) -> models.GrantCustomerCreditsResponse:
318
+ """Grant credits to a customer
319
+
320
+ POST /v1/sdk/customers/{reference}/credits"""
321
+ data = await self._transport.request(
322
+ "POST",
323
+ f"/v1/sdk/customers/{path_segment(reference)}/credits",
324
+ query={},
325
+ headers={"Idempotency-Key": idempotency_key},
326
+ body=encode_body(body),
327
+ )
328
+ return self._transport.parse(models.GrantCustomerCreditsResponse, data)
329
+
330
+ async def check_limits(
331
+ self,
332
+ *,
333
+ body: models.CheckLimitRequest | dict[str, Any],
334
+ ) -> models.LimitResponse:
335
+ """Check usage limits for a customer and product
336
+
337
+ POST /v1/sdk/limits"""
338
+ data = await self._transport.request(
339
+ "POST",
340
+ f"/v1/sdk/limits",
341
+ query={},
342
+ headers={},
343
+ body=encode_body(body),
344
+ )
345
+ return self._transport.parse(models.LimitResponse, data)
346
+
347
+ async def get_merchant(
348
+ self,
349
+ ) -> models.SdkMerchantResponseDto:
350
+ """Get merchant identity for the authenticated provider
351
+
352
+ GET /v1/sdk/merchant"""
353
+ data = await self._transport.request(
354
+ "GET",
355
+ f"/v1/sdk/merchant",
356
+ query={},
357
+ headers={},
358
+ body=None,
359
+ )
360
+ return self._transport.parse(models.SdkMerchantResponseDto, data)
361
+
362
+ async def record_meter_event(
363
+ self,
364
+ *,
365
+ body: models.RecordMeterEventZodDto | dict[str, Any],
366
+ ) -> models.RecordMeterEventResponse:
367
+ """Record a meter event
368
+
369
+ POST /v1/sdk/meter-events"""
370
+ data = await self._transport.request(
371
+ "POST",
372
+ f"/v1/sdk/meter-events",
373
+ query={},
374
+ headers={},
375
+ body=encode_body(body),
376
+ )
377
+ return self._transport.parse(models.RecordMeterEventResponse, data)
378
+
379
+ async def record_meter_events_bulk(
380
+ self,
381
+ *,
382
+ body: models.RecordBulkMeterEventsZodDto | dict[str, Any],
383
+ ) -> models.RecordMeterEventsBulkResponse:
384
+ """Record meter events in bulk
385
+
386
+ POST /v1/sdk/meter-events/bulk"""
387
+ data = await self._transport.request(
388
+ "POST",
389
+ f"/v1/sdk/meter-events/bulk",
390
+ query={},
391
+ headers={},
392
+ body=encode_body(body),
393
+ )
394
+ return self._transport.parse(models.RecordMeterEventsBulkResponse, data)
395
+
396
+ async def get_payment_intents(
397
+ self,
398
+ *,
399
+ limit: float | None = None,
400
+ offset: float | None = None,
401
+ ) -> models.SdkPaymentIntentListResponse:
402
+ """List payment intents for the provider
403
+
404
+ GET /v1/sdk/payment-intents"""
405
+ data = await self._transport.request(
406
+ "GET",
407
+ f"/v1/sdk/payment-intents",
408
+ query={"limit": limit, "offset": offset},
409
+ headers={},
410
+ body=None,
411
+ )
412
+ return self._transport.parse(models.SdkPaymentIntentListResponse, data)
413
+
414
+ async def create_payment_intent(
415
+ self,
416
+ *,
417
+ body: models.CreatePaymentIntentDto | dict[str, Any],
418
+ idempotency_key: str,
419
+ ) -> models.SdkPaymentIntentResponse:
420
+ """Create a payment intent
421
+
422
+ POST /v1/sdk/payment-intents"""
423
+ data = await self._transport.request(
424
+ "POST",
425
+ f"/v1/sdk/payment-intents",
426
+ query={},
427
+ headers={"idempotency-key": idempotency_key},
428
+ body=encode_body(body),
429
+ )
430
+ return self._transport.parse(models.SdkPaymentIntentResponse, data)
431
+
432
+ async def attach_business_details(
433
+ self,
434
+ *,
435
+ processor_payment_id: str,
436
+ body: models.BusinessDetailsDto | dict[str, Any],
437
+ ) -> models.AttachBusinessDetailsResponse:
438
+ """Attach business tax details to a payment intent
439
+
440
+ POST /v1/sdk/payment-intents/{processorPaymentId}/business-details"""
441
+ data = await self._transport.request(
442
+ "POST",
443
+ f"/v1/sdk/payment-intents/{path_segment(processor_payment_id)}/business-details",
444
+ query={},
445
+ headers={},
446
+ body=encode_body(body),
447
+ )
448
+ return self._transport.parse(models.AttachBusinessDetailsResponse, data)
449
+
450
+ async def process_payment_intent(
451
+ self,
452
+ *,
453
+ processor_payment_id: str,
454
+ body: models.ProcessPaymentIntentDto | dict[str, Any],
455
+ ) -> models.ProcessPaymentIntentResponse:
456
+ """Process payment intent after client-side confirmation
457
+
458
+ POST /v1/sdk/payment-intents/{processorPaymentId}/process"""
459
+ data = await self._transport.request(
460
+ "POST",
461
+ f"/v1/sdk/payment-intents/{path_segment(processor_payment_id)}/process",
462
+ query={},
463
+ headers={},
464
+ body=encode_body(body),
465
+ )
466
+ return self._transport.parse(models.ProcessPaymentIntentResponse, data)
467
+
468
+ async def get_payment_intent(
469
+ self,
470
+ *,
471
+ reference: str,
472
+ ) -> models.SdkPaymentIntentResponse:
473
+ """Get a specific payment intent
474
+
475
+ GET /v1/sdk/payment-intents/{reference}"""
476
+ data = await self._transport.request(
477
+ "GET",
478
+ f"/v1/sdk/payment-intents/{path_segment(reference)}",
479
+ query={},
480
+ headers={},
481
+ body=None,
482
+ )
483
+ return self._transport.parse(models.SdkPaymentIntentResponse, data)
484
+
485
+ async def get_payment_method(
486
+ self,
487
+ *,
488
+ customer_ref: str,
489
+ ) -> models.GetPaymentMethodResponse:
490
+ """Get the default payment method for a customer
491
+
492
+ GET /v1/sdk/payment-method"""
493
+ data = await self._transport.request(
494
+ "GET",
495
+ f"/v1/sdk/payment-method",
496
+ query={"customerRef": customer_ref},
497
+ headers={},
498
+ body=None,
499
+ )
500
+ return self._transport.parse(models.GetPaymentMethodResponse, data)
501
+
502
+ async def get_platform_config(
503
+ self,
504
+ ) -> models.SdkPlatformConfigResponseDto:
505
+ """Get environment-aware platform config for the authenticated provider
506
+
507
+ GET /v1/sdk/platform-config"""
508
+ data = await self._transport.request(
509
+ "GET",
510
+ f"/v1/sdk/platform-config",
511
+ query={},
512
+ headers={},
513
+ body=None,
514
+ )
515
+ return self._transport.parse(models.SdkPlatformConfigResponseDto, data)
516
+
517
+ async def list_products(
518
+ self,
519
+ *,
520
+ limit: float | None = None,
521
+ offset: float | None = None,
522
+ search: str | None = None,
523
+ status: str | None = None,
524
+ is_managed_mcp: bool | None = None,
525
+ is_mcp_pay: bool | None = None,
526
+ ) -> models.ListProductsResponse:
527
+ """List products
528
+
529
+ GET /v1/sdk/products"""
530
+ data = await self._transport.request(
531
+ "GET",
532
+ f"/v1/sdk/products",
533
+ query={
534
+ "limit": limit,
535
+ "offset": offset,
536
+ "search": search,
537
+ "status": status,
538
+ "isManagedMcp": is_managed_mcp,
539
+ "isMcpPay": is_mcp_pay,
540
+ },
541
+ headers={},
542
+ body=None,
543
+ )
544
+ return self._transport.parse(models.ListProductsResponse, data)
545
+
546
+ async def create_product(
547
+ self,
548
+ *,
549
+ body: models.CreateProductRequest | dict[str, Any],
550
+ ) -> models.SdkProductResponse:
551
+ """Create a product
552
+
553
+ POST /v1/sdk/products"""
554
+ data = await self._transport.request(
555
+ "POST",
556
+ f"/v1/sdk/products",
557
+ query={},
558
+ headers={},
559
+ body=encode_body(body),
560
+ )
561
+ return self._transport.parse(models.SdkProductResponse, data)
562
+
563
+ async def bootstrap_mcp_product(
564
+ self,
565
+ *,
566
+ body: models.McpBootstrapDto | dict[str, Any],
567
+ ) -> models.McpBootstrapResult:
568
+ """Bootstrap MCP product integration
569
+
570
+ POST /v1/sdk/products/mcp/bootstrap"""
571
+ data = await self._transport.request(
572
+ "POST",
573
+ f"/v1/sdk/products/mcp/bootstrap",
574
+ query={},
575
+ headers={},
576
+ body=encode_body(body),
577
+ )
578
+ return self._transport.parse(models.McpBootstrapResult, data)
579
+
580
+ async def delete_product(
581
+ self,
582
+ *,
583
+ product_ref: str,
584
+ ) -> models.DeleteProductResponse:
585
+ """Delete a product
586
+
587
+ DELETE /v1/sdk/products/{productRef}"""
588
+ data = await self._transport.request(
589
+ "DELETE",
590
+ f"/v1/sdk/products/{path_segment(product_ref)}",
591
+ query={},
592
+ headers={},
593
+ body=None,
594
+ )
595
+ return self._transport.parse(models.DeleteProductResponse, data)
596
+
597
+ async def get_product(
598
+ self,
599
+ *,
600
+ product_ref: str,
601
+ ) -> models.SdkProductResponse:
602
+ """Get a product by reference
603
+
604
+ GET /v1/sdk/products/{productRef}"""
605
+ data = await self._transport.request(
606
+ "GET",
607
+ f"/v1/sdk/products/{path_segment(product_ref)}",
608
+ query={},
609
+ headers={},
610
+ body=None,
611
+ )
612
+ return self._transport.parse(models.SdkProductResponse, data)
613
+
614
+ async def update_product(
615
+ self,
616
+ *,
617
+ product_ref: str,
618
+ body: models.UpdateProductRequest | dict[str, Any],
619
+ ) -> models.SdkProductResponse:
620
+ """Update a product
621
+
622
+ PUT /v1/sdk/products/{productRef}"""
623
+ data = await self._transport.request(
624
+ "PUT",
625
+ f"/v1/sdk/products/{path_segment(product_ref)}",
626
+ query={},
627
+ headers={},
628
+ body=encode_body(body),
629
+ )
630
+ return self._transport.parse(models.SdkProductResponse, data)
631
+
632
+ async def clone_product(
633
+ self,
634
+ *,
635
+ product_ref: str,
636
+ body: models.CloneProductDto | dict[str, Any],
637
+ ) -> models.SdkProductResponse:
638
+ """Clone a product
639
+
640
+ POST /v1/sdk/products/{productRef}/clone"""
641
+ data = await self._transport.request(
642
+ "POST",
643
+ f"/v1/sdk/products/{path_segment(product_ref)}/clone",
644
+ query={},
645
+ headers={},
646
+ body=encode_body(body),
647
+ )
648
+ return self._transport.parse(models.SdkProductResponse, data)
649
+
650
+ async def configure_mcp_plans(
651
+ self,
652
+ *,
653
+ product_ref: str,
654
+ body: models.ConfigureMcpPlansDto | dict[str, Any],
655
+ ) -> models.ConfigureMcpPlansResult:
656
+ """Configure MCP plans on an MCP product
657
+
658
+ PUT /v1/sdk/products/{productRef}/mcp/plans"""
659
+ data = await self._transport.request(
660
+ "PUT",
661
+ f"/v1/sdk/products/{path_segment(product_ref)}/mcp/plans",
662
+ query={},
663
+ headers={},
664
+ body=encode_body(body),
665
+ )
666
+ return self._transport.parse(models.ConfigureMcpPlansResult, data)
667
+
668
+ async def list_plans(
669
+ self,
670
+ *,
671
+ product_ref: str,
672
+ limit: float | None = None,
673
+ offset: float | None = None,
674
+ ) -> models.ListPlansResponse:
675
+ """List plans for a product
676
+
677
+ GET /v1/sdk/products/{productRef}/plans"""
678
+ data = await self._transport.request(
679
+ "GET",
680
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans",
681
+ query={"limit": limit, "offset": offset},
682
+ headers={},
683
+ body=None,
684
+ )
685
+ return self._transport.parse(models.ListPlansResponse, data)
686
+
687
+ async def create_plan(
688
+ self,
689
+ *,
690
+ product_ref: str,
691
+ body: models.CreatePlanRequest | dict[str, Any],
692
+ ) -> models.Plan:
693
+ """Create a plan for a product
694
+
695
+ POST /v1/sdk/products/{productRef}/plans"""
696
+ data = await self._transport.request(
697
+ "POST",
698
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans",
699
+ query={},
700
+ headers={},
701
+ body=encode_body(body),
702
+ )
703
+ return self._transport.parse(models.Plan, data)
704
+
705
+ async def delete_plan(
706
+ self,
707
+ *,
708
+ product_ref: str,
709
+ plan_ref: str,
710
+ ) -> models.DeletePlanResponse:
711
+ """Delete a plan from a product
712
+
713
+ DELETE /v1/sdk/products/{productRef}/plans/{planRef}"""
714
+ data = await self._transport.request(
715
+ "DELETE",
716
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
717
+ query={},
718
+ headers={},
719
+ body=None,
720
+ )
721
+ return self._transport.parse(models.DeletePlanResponse, data)
722
+
723
+ async def get_plan(
724
+ self,
725
+ *,
726
+ product_ref: str,
727
+ plan_ref: str,
728
+ ) -> models.Plan:
729
+ """Get a plan for a product
730
+
731
+ GET /v1/sdk/products/{productRef}/plans/{planRef}"""
732
+ data = await self._transport.request(
733
+ "GET",
734
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
735
+ query={},
736
+ headers={},
737
+ body=None,
738
+ )
739
+ return self._transport.parse(models.Plan, data)
740
+
741
+ async def update_plan(
742
+ self,
743
+ *,
744
+ product_ref: str,
745
+ plan_ref: str,
746
+ body: models.UpdatePlanRequest | dict[str, Any],
747
+ ) -> models.Plan:
748
+ """Update a plan for a product
749
+
750
+ PUT /v1/sdk/products/{productRef}/plans/{planRef}"""
751
+ data = await self._transport.request(
752
+ "PUT",
753
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
754
+ query={},
755
+ headers={},
756
+ body=encode_body(body),
757
+ )
758
+ return self._transport.parse(models.Plan, data)
759
+
760
+ async def list_purchases(
761
+ self,
762
+ *,
763
+ status: str | None = None,
764
+ product_ref: str | None = None,
765
+ customer_ref: str | None = None,
766
+ include_free: bool | None = None,
767
+ ) -> models.ListPurchasesResponse:
768
+ """List purchases for provider
769
+
770
+ GET /v1/sdk/purchases"""
771
+ data = await self._transport.request(
772
+ "GET",
773
+ f"/v1/sdk/purchases",
774
+ query={
775
+ "status": status,
776
+ "productRef": product_ref,
777
+ "customerRef": customer_ref,
778
+ "includeFree": include_free,
779
+ },
780
+ headers={},
781
+ body=None,
782
+ )
783
+ return self._transport.parse(models.ListPurchasesResponse, data)
784
+
785
+ async def get_purchases_for_customer(
786
+ self,
787
+ *,
788
+ customer_ref: str,
789
+ include_free: bool | None = None,
790
+ ) -> models.GetPurchasesForCustomerResponse:
791
+ """Get purchases for a customer
792
+
793
+ GET /v1/sdk/purchases/customer/{customerRef}"""
794
+ data = await self._transport.request(
795
+ "GET",
796
+ f"/v1/sdk/purchases/customer/{path_segment(customer_ref)}",
797
+ query={"includeFree": include_free},
798
+ headers={},
799
+ body=None,
800
+ )
801
+ return self._transport.parse(models.GetPurchasesForCustomerResponse, data)
802
+
803
+ async def get_purchases_for_product(
804
+ self,
805
+ *,
806
+ product_ref: str,
807
+ ) -> models.GetPurchasesForProductResponse:
808
+ """Get purchases for a product
809
+
810
+ GET /v1/sdk/purchases/product/{productRef}"""
811
+ data = await self._transport.request(
812
+ "GET",
813
+ f"/v1/sdk/purchases/product/{path_segment(product_ref)}",
814
+ query={},
815
+ headers={},
816
+ body=None,
817
+ )
818
+ return self._transport.parse(models.GetPurchasesForProductResponse, data)
819
+
820
+ async def get_purchase(
821
+ self,
822
+ *,
823
+ purchase_ref: str,
824
+ ) -> models.SdkPurchaseResponse:
825
+ """Get a purchase by reference
826
+
827
+ GET /v1/sdk/purchases/{purchaseRef}"""
828
+ data = await self._transport.request(
829
+ "GET",
830
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}",
831
+ query={},
832
+ headers={},
833
+ body=None,
834
+ )
835
+ return self._transport.parse(models.SdkPurchaseResponse, data)
836
+
837
+ async def cancel_purchase(
838
+ self,
839
+ *,
840
+ purchase_ref: str,
841
+ body: models.CancelPurchaseRequest | dict[str, Any],
842
+ ) -> models.CancelPurchaseResponse:
843
+ """Cancel a purchase
844
+
845
+ POST /v1/sdk/purchases/{purchaseRef}/cancel"""
846
+ data = await self._transport.request(
847
+ "POST",
848
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}/cancel",
849
+ query={},
850
+ headers={},
851
+ body=encode_body(body),
852
+ )
853
+ return self._transport.parse(models.CancelPurchaseResponse, data)
854
+
855
+ async def reactivate_purchase(
856
+ self,
857
+ *,
858
+ purchase_ref: str,
859
+ ) -> models.ReactivatePurchaseResponse:
860
+ """Reactivate a cancelled purchase
861
+
862
+ POST /v1/sdk/purchases/{purchaseRef}/reactivate"""
863
+ data = await self._transport.request(
864
+ "POST",
865
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}/reactivate",
866
+ query={},
867
+ headers={},
868
+ body=None,
869
+ )
870
+ return self._transport.parse(models.ReactivatePurchaseResponse, data)
871
+
872
+ async def record_usage(
873
+ self,
874
+ *,
875
+ body: models.CreateUsageRequest | dict[str, Any],
876
+ ) -> models.UsageRecordResponse:
877
+ """Record a usage event
878
+
879
+ POST /v1/sdk/usages"""
880
+ data = await self._transport.request(
881
+ "POST",
882
+ f"/v1/sdk/usages",
883
+ query={},
884
+ headers={},
885
+ body=encode_body(body),
886
+ )
887
+ return self._transport.parse(models.UsageRecordResponse, data)
888
+
889
+ async def record_usage_bulk(
890
+ self,
891
+ *,
892
+ body: models.BulkCreateUsageRequest | dict[str, Any],
893
+ ) -> models.BulkUsageResponse:
894
+ """Record bulk usage events
895
+
896
+ POST /v1/sdk/usages/bulk"""
897
+ data = await self._transport.request(
898
+ "POST",
899
+ f"/v1/sdk/usages/bulk",
900
+ query={},
901
+ headers={},
902
+ body=encode_body(body),
903
+ )
904
+ return self._transport.parse(models.BulkUsageResponse, data)
905
+
906
+ async def get_user_info(
907
+ self,
908
+ *,
909
+ body: models.UserInfoRequest | dict[str, Any],
910
+ ) -> models.UserInfoResponse:
911
+ """Get user info and purchase status
912
+
913
+ POST /v1/sdk/user-info"""
914
+ data = await self._transport.request(
915
+ "POST",
916
+ f"/v1/sdk/user-info",
917
+ query={},
918
+ headers={},
919
+ body=encode_body(body),
920
+ )
921
+ return self._transport.parse(models.UserInfoResponse, data)
922
+
923
+ async def get_webhook_event_schema(
924
+ self,
925
+ ) -> models.WebhookEventDto:
926
+ """Get the webhook event envelope schema
927
+
928
+ GET /v1/sdk/webhooks/event-schema"""
929
+ data = await self._transport.request(
930
+ "GET",
931
+ f"/v1/sdk/webhooks/event-schema",
932
+ query={},
933
+ headers={},
934
+ body=None,
935
+ )
936
+ return self._transport.parse(models.WebhookEventDto, data)
937
+
938
+ async def list_webhook_event_types(
939
+ self,
940
+ ) -> models.ListWebhookEventTypesResponse:
941
+ """List webhook event types
942
+
943
+ GET /v1/sdk/webhooks/event-types"""
944
+ data = await self._transport.request(
945
+ "GET",
946
+ f"/v1/sdk/webhooks/event-types",
947
+ query={},
948
+ headers={},
949
+ body=None,
950
+ )
951
+ return self._transport.parse(models.ListWebhookEventTypesResponse, data)
952
+
953
+
954
+ class SolvaPayApi:
955
+ """Every SolvaPay API operation, blocking: one method per operation."""
956
+
957
+ def __init__(self, transport: SyncTransport) -> None:
958
+ self._transport = transport
959
+
960
+ def activate_plan(
961
+ self,
962
+ *,
963
+ body: models.ActivatePlanDto | dict[str, Any],
964
+ ) -> models.ActivatePlanResponseDto:
965
+ """Activate a plan for a customer
966
+
967
+ POST /v1/sdk/activate"""
968
+ data = self._transport.request(
969
+ "POST",
970
+ f"/v1/sdk/activate",
971
+ query={},
972
+ headers={},
973
+ body=encode_body(body),
974
+ )
975
+ return self._transport.parse(models.ActivatePlanResponseDto, data)
976
+
977
+ def authorize_agent_call(
978
+ self,
979
+ *,
980
+ body: models.AuthorizeCallDto | dict[str, Any],
981
+ ) -> models.AuthorizeCallResponseDto:
982
+ """Authorize a paid agent call: the customer, the agent's spend policy and the estimate held against budget and balance
983
+
984
+ POST /v1/sdk/agent/calls"""
985
+ data = self._transport.request(
986
+ "POST",
987
+ f"/v1/sdk/agent/calls",
988
+ query={},
989
+ headers={},
990
+ body=encode_body(body),
991
+ )
992
+ return self._transport.parse(models.AuthorizeCallResponseDto, data)
993
+
994
+ def complete_agent_call(
995
+ self,
996
+ *,
997
+ call_ref: str,
998
+ body: models.CompleteCallDto | dict[str, Any],
999
+ ) -> models.CompleteCallResponseDto:
1000
+ """Complete an allowed agent call: settle the spend policy and debit the call's customer at the reported cost
1001
+
1002
+ POST /v1/sdk/agent/calls/{callRef}/complete"""
1003
+ data = self._transport.request(
1004
+ "POST",
1005
+ f"/v1/sdk/agent/calls/{path_segment(call_ref)}/complete",
1006
+ query={},
1007
+ headers={},
1008
+ body=encode_body(body),
1009
+ )
1010
+ return self._transport.parse(models.CompleteCallResponseDto, data)
1011
+
1012
+ def verify_agent_key(
1013
+ self,
1014
+ *,
1015
+ body: models.VerifyAgentKeyDto | dict[str, Any],
1016
+ ) -> models.VerifiedAgentKeyResponseDto:
1017
+ """Read the agent behind an agent key issued for this merchant
1018
+
1019
+ POST /v1/sdk/agent/keys/verifications"""
1020
+ data = self._transport.request(
1021
+ "POST",
1022
+ f"/v1/sdk/agent/keys/verifications",
1023
+ query={},
1024
+ headers={},
1025
+ body=encode_body(body),
1026
+ )
1027
+ return self._transport.parse(models.VerifiedAgentKeyResponseDto, data)
1028
+
1029
+ def report_agent_usage(
1030
+ self,
1031
+ *,
1032
+ body: models.UsageReportDto | dict[str, Any],
1033
+ ) -> models.UsageReportResponseDto:
1034
+ """Report the merchant's own cost of each decided agent call; SolvaPay corrects the spend policy and the credits to it
1035
+
1036
+ POST /v1/sdk/agent/usage-reports"""
1037
+ data = self._transport.request(
1038
+ "POST",
1039
+ f"/v1/sdk/agent/usage-reports",
1040
+ query={},
1041
+ headers={},
1042
+ body=encode_body(body),
1043
+ )
1044
+ return self._transport.parse(models.UsageReportResponseDto, data)
1045
+
1046
+ def disable_auto_recharge(
1047
+ self,
1048
+ *,
1049
+ customer_ref: str,
1050
+ ) -> models.DisableAutoRechargeResponse:
1051
+ """Disable auto-recharge for a customer
1052
+
1053
+ DELETE /v1/sdk/auto-recharge"""
1054
+ data = self._transport.request(
1055
+ "DELETE",
1056
+ f"/v1/sdk/auto-recharge",
1057
+ query={"customerRef": customer_ref},
1058
+ headers={},
1059
+ body=None,
1060
+ )
1061
+ return self._transport.parse(models.DisableAutoRechargeResponse, data)
1062
+
1063
+ def get_auto_recharge(
1064
+ self,
1065
+ *,
1066
+ customer_ref: str,
1067
+ ) -> models.AutoRechargeGetResponse:
1068
+ """Get auto-recharge config for a customer
1069
+
1070
+ GET /v1/sdk/auto-recharge"""
1071
+ data = self._transport.request(
1072
+ "GET",
1073
+ f"/v1/sdk/auto-recharge",
1074
+ query={"customerRef": customer_ref},
1075
+ headers={},
1076
+ body=None,
1077
+ )
1078
+ return self._transport.parse(models.AutoRechargeGetResponse, data)
1079
+
1080
+ def save_auto_recharge(
1081
+ self,
1082
+ *,
1083
+ body: models.PutAutoRechargeSdkDto | dict[str, Any],
1084
+ ) -> models.SaveAutoRechargeResponse:
1085
+ """Set or update auto-recharge config for a customer
1086
+
1087
+ PUT /v1/sdk/auto-recharge"""
1088
+ data = self._transport.request(
1089
+ "PUT",
1090
+ f"/v1/sdk/auto-recharge",
1091
+ query={},
1092
+ headers={},
1093
+ body=encode_body(body),
1094
+ )
1095
+ return self._transport.parse(models.SaveAutoRechargeResponse, data)
1096
+
1097
+ def create_checkout_session(
1098
+ self,
1099
+ *,
1100
+ body: models.CreateCheckoutSessionRequest | dict[str, Any],
1101
+ ) -> models.CreateCheckoutSessionResponse:
1102
+ """Create a checkout session
1103
+
1104
+ POST /v1/sdk/checkout-sessions"""
1105
+ data = self._transport.request(
1106
+ "POST",
1107
+ f"/v1/sdk/checkout-sessions",
1108
+ query={},
1109
+ headers={},
1110
+ body=encode_body(body),
1111
+ )
1112
+ return self._transport.parse(models.CreateCheckoutSessionResponse, data)
1113
+
1114
+ def get_credit_activity(
1115
+ self,
1116
+ *,
1117
+ customer_ref: str,
1118
+ limit: float | None = None,
1119
+ ) -> models.CreditActivityResponseDto:
1120
+ """List account-wide credit activity for a customer
1121
+
1122
+ GET /v1/sdk/credits/activity"""
1123
+ data = self._transport.request(
1124
+ "GET",
1125
+ f"/v1/sdk/credits/activity",
1126
+ query={"customerRef": customer_ref, "limit": limit},
1127
+ headers={},
1128
+ body=None,
1129
+ )
1130
+ return self._transport.parse(models.CreditActivityResponseDto, data)
1131
+
1132
+ def get_customer_by_query(
1133
+ self,
1134
+ *,
1135
+ reference: str | None = None,
1136
+ external_ref: str | None = None,
1137
+ email: str | None = None,
1138
+ ) -> models.CustomerResponse:
1139
+ """Get customer by reference, externalRef, or email
1140
+
1141
+ GET /v1/sdk/customers"""
1142
+ data = self._transport.request(
1143
+ "GET",
1144
+ f"/v1/sdk/customers",
1145
+ query={"reference": reference, "externalRef": external_ref, "email": email},
1146
+ headers={},
1147
+ body=None,
1148
+ )
1149
+ return self._transport.parse(models.CustomerResponse, data)
1150
+
1151
+ def create_customer(
1152
+ self,
1153
+ *,
1154
+ body: models.CreateCustomerRequest | dict[str, Any],
1155
+ ) -> models.CustomerResponse:
1156
+ """Create a new customer
1157
+
1158
+ POST /v1/sdk/customers"""
1159
+ data = self._transport.request(
1160
+ "POST",
1161
+ f"/v1/sdk/customers",
1162
+ query={},
1163
+ headers={},
1164
+ body=encode_body(body),
1165
+ )
1166
+ return self._transport.parse(models.CustomerResponse, data)
1167
+
1168
+ def create_customer_session(
1169
+ self,
1170
+ *,
1171
+ body: models.CreateCustomerSessionRequest | dict[str, Any],
1172
+ ) -> models.CreateCustomerSessionResponse:
1173
+ """Create a customer session
1174
+
1175
+ POST /v1/sdk/customers/customer-sessions"""
1176
+ data = self._transport.request(
1177
+ "POST",
1178
+ f"/v1/sdk/customers/customer-sessions",
1179
+ query={},
1180
+ headers={},
1181
+ body=encode_body(body),
1182
+ )
1183
+ return self._transport.parse(models.CreateCustomerSessionResponse, data)
1184
+
1185
+ def get_customer_session(
1186
+ self,
1187
+ *,
1188
+ session_id: str,
1189
+ ) -> models.GetCustomerSessionResponse:
1190
+ """Get customer session by sessionId
1191
+
1192
+ GET /v1/sdk/customers/customer-sessions/{sessionId}"""
1193
+ data = self._transport.request(
1194
+ "GET",
1195
+ f"/v1/sdk/customers/customer-sessions/{path_segment(session_id)}",
1196
+ query={},
1197
+ headers={},
1198
+ body=None,
1199
+ )
1200
+ return self._transport.parse(models.GetCustomerSessionResponse, data)
1201
+
1202
+ def get_customer(
1203
+ self,
1204
+ *,
1205
+ reference: str,
1206
+ ) -> models.CustomerResponse:
1207
+ """Get customer by reference
1208
+
1209
+ GET /v1/sdk/customers/{reference}"""
1210
+ data = self._transport.request(
1211
+ "GET",
1212
+ f"/v1/sdk/customers/{path_segment(reference)}",
1213
+ query={},
1214
+ headers={},
1215
+ body=None,
1216
+ )
1217
+ return self._transport.parse(models.CustomerResponse, data)
1218
+
1219
+ def update_customer(
1220
+ self,
1221
+ *,
1222
+ reference: str,
1223
+ body: models.UpdateCustomerRequest | dict[str, Any],
1224
+ ) -> models.CustomerResponse:
1225
+ """Update a customer
1226
+
1227
+ PATCH /v1/sdk/customers/{reference}"""
1228
+ data = self._transport.request(
1229
+ "PATCH",
1230
+ f"/v1/sdk/customers/{path_segment(reference)}",
1231
+ query={},
1232
+ headers={},
1233
+ body=encode_body(body),
1234
+ )
1235
+ return self._transport.parse(models.CustomerResponse, data)
1236
+
1237
+ def get_customer_balance(
1238
+ self,
1239
+ *,
1240
+ reference: str,
1241
+ ) -> models.CustomerBalanceResponse:
1242
+ """Get customer credit balance
1243
+
1244
+ GET /v1/sdk/customers/{reference}/balance"""
1245
+ data = self._transport.request(
1246
+ "GET",
1247
+ f"/v1/sdk/customers/{path_segment(reference)}/balance",
1248
+ query={},
1249
+ headers={},
1250
+ body=None,
1251
+ )
1252
+ return self._transport.parse(models.CustomerBalanceResponse, data)
1253
+
1254
+ def grant_credits(
1255
+ self,
1256
+ *,
1257
+ reference: str,
1258
+ body: models.GrantCustomerCreditsRequest | dict[str, Any],
1259
+ idempotency_key: str | None = None,
1260
+ ) -> models.GrantCustomerCreditsResponse:
1261
+ """Grant credits to a customer
1262
+
1263
+ POST /v1/sdk/customers/{reference}/credits"""
1264
+ data = self._transport.request(
1265
+ "POST",
1266
+ f"/v1/sdk/customers/{path_segment(reference)}/credits",
1267
+ query={},
1268
+ headers={"Idempotency-Key": idempotency_key},
1269
+ body=encode_body(body),
1270
+ )
1271
+ return self._transport.parse(models.GrantCustomerCreditsResponse, data)
1272
+
1273
+ def check_limits(
1274
+ self,
1275
+ *,
1276
+ body: models.CheckLimitRequest | dict[str, Any],
1277
+ ) -> models.LimitResponse:
1278
+ """Check usage limits for a customer and product
1279
+
1280
+ POST /v1/sdk/limits"""
1281
+ data = self._transport.request(
1282
+ "POST",
1283
+ f"/v1/sdk/limits",
1284
+ query={},
1285
+ headers={},
1286
+ body=encode_body(body),
1287
+ )
1288
+ return self._transport.parse(models.LimitResponse, data)
1289
+
1290
+ def get_merchant(
1291
+ self,
1292
+ ) -> models.SdkMerchantResponseDto:
1293
+ """Get merchant identity for the authenticated provider
1294
+
1295
+ GET /v1/sdk/merchant"""
1296
+ data = self._transport.request(
1297
+ "GET",
1298
+ f"/v1/sdk/merchant",
1299
+ query={},
1300
+ headers={},
1301
+ body=None,
1302
+ )
1303
+ return self._transport.parse(models.SdkMerchantResponseDto, data)
1304
+
1305
+ def record_meter_event(
1306
+ self,
1307
+ *,
1308
+ body: models.RecordMeterEventZodDto | dict[str, Any],
1309
+ ) -> models.RecordMeterEventResponse:
1310
+ """Record a meter event
1311
+
1312
+ POST /v1/sdk/meter-events"""
1313
+ data = self._transport.request(
1314
+ "POST",
1315
+ f"/v1/sdk/meter-events",
1316
+ query={},
1317
+ headers={},
1318
+ body=encode_body(body),
1319
+ )
1320
+ return self._transport.parse(models.RecordMeterEventResponse, data)
1321
+
1322
+ def record_meter_events_bulk(
1323
+ self,
1324
+ *,
1325
+ body: models.RecordBulkMeterEventsZodDto | dict[str, Any],
1326
+ ) -> models.RecordMeterEventsBulkResponse:
1327
+ """Record meter events in bulk
1328
+
1329
+ POST /v1/sdk/meter-events/bulk"""
1330
+ data = self._transport.request(
1331
+ "POST",
1332
+ f"/v1/sdk/meter-events/bulk",
1333
+ query={},
1334
+ headers={},
1335
+ body=encode_body(body),
1336
+ )
1337
+ return self._transport.parse(models.RecordMeterEventsBulkResponse, data)
1338
+
1339
+ def get_payment_intents(
1340
+ self,
1341
+ *,
1342
+ limit: float | None = None,
1343
+ offset: float | None = None,
1344
+ ) -> models.SdkPaymentIntentListResponse:
1345
+ """List payment intents for the provider
1346
+
1347
+ GET /v1/sdk/payment-intents"""
1348
+ data = self._transport.request(
1349
+ "GET",
1350
+ f"/v1/sdk/payment-intents",
1351
+ query={"limit": limit, "offset": offset},
1352
+ headers={},
1353
+ body=None,
1354
+ )
1355
+ return self._transport.parse(models.SdkPaymentIntentListResponse, data)
1356
+
1357
+ def create_payment_intent(
1358
+ self,
1359
+ *,
1360
+ body: models.CreatePaymentIntentDto | dict[str, Any],
1361
+ idempotency_key: str,
1362
+ ) -> models.SdkPaymentIntentResponse:
1363
+ """Create a payment intent
1364
+
1365
+ POST /v1/sdk/payment-intents"""
1366
+ data = self._transport.request(
1367
+ "POST",
1368
+ f"/v1/sdk/payment-intents",
1369
+ query={},
1370
+ headers={"idempotency-key": idempotency_key},
1371
+ body=encode_body(body),
1372
+ )
1373
+ return self._transport.parse(models.SdkPaymentIntentResponse, data)
1374
+
1375
+ def attach_business_details(
1376
+ self,
1377
+ *,
1378
+ processor_payment_id: str,
1379
+ body: models.BusinessDetailsDto | dict[str, Any],
1380
+ ) -> models.AttachBusinessDetailsResponse:
1381
+ """Attach business tax details to a payment intent
1382
+
1383
+ POST /v1/sdk/payment-intents/{processorPaymentId}/business-details"""
1384
+ data = self._transport.request(
1385
+ "POST",
1386
+ f"/v1/sdk/payment-intents/{path_segment(processor_payment_id)}/business-details",
1387
+ query={},
1388
+ headers={},
1389
+ body=encode_body(body),
1390
+ )
1391
+ return self._transport.parse(models.AttachBusinessDetailsResponse, data)
1392
+
1393
+ def process_payment_intent(
1394
+ self,
1395
+ *,
1396
+ processor_payment_id: str,
1397
+ body: models.ProcessPaymentIntentDto | dict[str, Any],
1398
+ ) -> models.ProcessPaymentIntentResponse:
1399
+ """Process payment intent after client-side confirmation
1400
+
1401
+ POST /v1/sdk/payment-intents/{processorPaymentId}/process"""
1402
+ data = self._transport.request(
1403
+ "POST",
1404
+ f"/v1/sdk/payment-intents/{path_segment(processor_payment_id)}/process",
1405
+ query={},
1406
+ headers={},
1407
+ body=encode_body(body),
1408
+ )
1409
+ return self._transport.parse(models.ProcessPaymentIntentResponse, data)
1410
+
1411
+ def get_payment_intent(
1412
+ self,
1413
+ *,
1414
+ reference: str,
1415
+ ) -> models.SdkPaymentIntentResponse:
1416
+ """Get a specific payment intent
1417
+
1418
+ GET /v1/sdk/payment-intents/{reference}"""
1419
+ data = self._transport.request(
1420
+ "GET",
1421
+ f"/v1/sdk/payment-intents/{path_segment(reference)}",
1422
+ query={},
1423
+ headers={},
1424
+ body=None,
1425
+ )
1426
+ return self._transport.parse(models.SdkPaymentIntentResponse, data)
1427
+
1428
+ def get_payment_method(
1429
+ self,
1430
+ *,
1431
+ customer_ref: str,
1432
+ ) -> models.GetPaymentMethodResponse:
1433
+ """Get the default payment method for a customer
1434
+
1435
+ GET /v1/sdk/payment-method"""
1436
+ data = self._transport.request(
1437
+ "GET",
1438
+ f"/v1/sdk/payment-method",
1439
+ query={"customerRef": customer_ref},
1440
+ headers={},
1441
+ body=None,
1442
+ )
1443
+ return self._transport.parse(models.GetPaymentMethodResponse, data)
1444
+
1445
+ def get_platform_config(
1446
+ self,
1447
+ ) -> models.SdkPlatformConfigResponseDto:
1448
+ """Get environment-aware platform config for the authenticated provider
1449
+
1450
+ GET /v1/sdk/platform-config"""
1451
+ data = self._transport.request(
1452
+ "GET",
1453
+ f"/v1/sdk/platform-config",
1454
+ query={},
1455
+ headers={},
1456
+ body=None,
1457
+ )
1458
+ return self._transport.parse(models.SdkPlatformConfigResponseDto, data)
1459
+
1460
+ def list_products(
1461
+ self,
1462
+ *,
1463
+ limit: float | None = None,
1464
+ offset: float | None = None,
1465
+ search: str | None = None,
1466
+ status: str | None = None,
1467
+ is_managed_mcp: bool | None = None,
1468
+ is_mcp_pay: bool | None = None,
1469
+ ) -> models.ListProductsResponse:
1470
+ """List products
1471
+
1472
+ GET /v1/sdk/products"""
1473
+ data = self._transport.request(
1474
+ "GET",
1475
+ f"/v1/sdk/products",
1476
+ query={
1477
+ "limit": limit,
1478
+ "offset": offset,
1479
+ "search": search,
1480
+ "status": status,
1481
+ "isManagedMcp": is_managed_mcp,
1482
+ "isMcpPay": is_mcp_pay,
1483
+ },
1484
+ headers={},
1485
+ body=None,
1486
+ )
1487
+ return self._transport.parse(models.ListProductsResponse, data)
1488
+
1489
+ def create_product(
1490
+ self,
1491
+ *,
1492
+ body: models.CreateProductRequest | dict[str, Any],
1493
+ ) -> models.SdkProductResponse:
1494
+ """Create a product
1495
+
1496
+ POST /v1/sdk/products"""
1497
+ data = self._transport.request(
1498
+ "POST",
1499
+ f"/v1/sdk/products",
1500
+ query={},
1501
+ headers={},
1502
+ body=encode_body(body),
1503
+ )
1504
+ return self._transport.parse(models.SdkProductResponse, data)
1505
+
1506
+ def bootstrap_mcp_product(
1507
+ self,
1508
+ *,
1509
+ body: models.McpBootstrapDto | dict[str, Any],
1510
+ ) -> models.McpBootstrapResult:
1511
+ """Bootstrap MCP product integration
1512
+
1513
+ POST /v1/sdk/products/mcp/bootstrap"""
1514
+ data = self._transport.request(
1515
+ "POST",
1516
+ f"/v1/sdk/products/mcp/bootstrap",
1517
+ query={},
1518
+ headers={},
1519
+ body=encode_body(body),
1520
+ )
1521
+ return self._transport.parse(models.McpBootstrapResult, data)
1522
+
1523
+ def delete_product(
1524
+ self,
1525
+ *,
1526
+ product_ref: str,
1527
+ ) -> models.DeleteProductResponse:
1528
+ """Delete a product
1529
+
1530
+ DELETE /v1/sdk/products/{productRef}"""
1531
+ data = self._transport.request(
1532
+ "DELETE",
1533
+ f"/v1/sdk/products/{path_segment(product_ref)}",
1534
+ query={},
1535
+ headers={},
1536
+ body=None,
1537
+ )
1538
+ return self._transport.parse(models.DeleteProductResponse, data)
1539
+
1540
+ def get_product(
1541
+ self,
1542
+ *,
1543
+ product_ref: str,
1544
+ ) -> models.SdkProductResponse:
1545
+ """Get a product by reference
1546
+
1547
+ GET /v1/sdk/products/{productRef}"""
1548
+ data = self._transport.request(
1549
+ "GET",
1550
+ f"/v1/sdk/products/{path_segment(product_ref)}",
1551
+ query={},
1552
+ headers={},
1553
+ body=None,
1554
+ )
1555
+ return self._transport.parse(models.SdkProductResponse, data)
1556
+
1557
+ def update_product(
1558
+ self,
1559
+ *,
1560
+ product_ref: str,
1561
+ body: models.UpdateProductRequest | dict[str, Any],
1562
+ ) -> models.SdkProductResponse:
1563
+ """Update a product
1564
+
1565
+ PUT /v1/sdk/products/{productRef}"""
1566
+ data = self._transport.request(
1567
+ "PUT",
1568
+ f"/v1/sdk/products/{path_segment(product_ref)}",
1569
+ query={},
1570
+ headers={},
1571
+ body=encode_body(body),
1572
+ )
1573
+ return self._transport.parse(models.SdkProductResponse, data)
1574
+
1575
+ def clone_product(
1576
+ self,
1577
+ *,
1578
+ product_ref: str,
1579
+ body: models.CloneProductDto | dict[str, Any],
1580
+ ) -> models.SdkProductResponse:
1581
+ """Clone a product
1582
+
1583
+ POST /v1/sdk/products/{productRef}/clone"""
1584
+ data = self._transport.request(
1585
+ "POST",
1586
+ f"/v1/sdk/products/{path_segment(product_ref)}/clone",
1587
+ query={},
1588
+ headers={},
1589
+ body=encode_body(body),
1590
+ )
1591
+ return self._transport.parse(models.SdkProductResponse, data)
1592
+
1593
+ def configure_mcp_plans(
1594
+ self,
1595
+ *,
1596
+ product_ref: str,
1597
+ body: models.ConfigureMcpPlansDto | dict[str, Any],
1598
+ ) -> models.ConfigureMcpPlansResult:
1599
+ """Configure MCP plans on an MCP product
1600
+
1601
+ PUT /v1/sdk/products/{productRef}/mcp/plans"""
1602
+ data = self._transport.request(
1603
+ "PUT",
1604
+ f"/v1/sdk/products/{path_segment(product_ref)}/mcp/plans",
1605
+ query={},
1606
+ headers={},
1607
+ body=encode_body(body),
1608
+ )
1609
+ return self._transport.parse(models.ConfigureMcpPlansResult, data)
1610
+
1611
+ def list_plans(
1612
+ self,
1613
+ *,
1614
+ product_ref: str,
1615
+ limit: float | None = None,
1616
+ offset: float | None = None,
1617
+ ) -> models.ListPlansResponse:
1618
+ """List plans for a product
1619
+
1620
+ GET /v1/sdk/products/{productRef}/plans"""
1621
+ data = self._transport.request(
1622
+ "GET",
1623
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans",
1624
+ query={"limit": limit, "offset": offset},
1625
+ headers={},
1626
+ body=None,
1627
+ )
1628
+ return self._transport.parse(models.ListPlansResponse, data)
1629
+
1630
+ def create_plan(
1631
+ self,
1632
+ *,
1633
+ product_ref: str,
1634
+ body: models.CreatePlanRequest | dict[str, Any],
1635
+ ) -> models.Plan:
1636
+ """Create a plan for a product
1637
+
1638
+ POST /v1/sdk/products/{productRef}/plans"""
1639
+ data = self._transport.request(
1640
+ "POST",
1641
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans",
1642
+ query={},
1643
+ headers={},
1644
+ body=encode_body(body),
1645
+ )
1646
+ return self._transport.parse(models.Plan, data)
1647
+
1648
+ def delete_plan(
1649
+ self,
1650
+ *,
1651
+ product_ref: str,
1652
+ plan_ref: str,
1653
+ ) -> models.DeletePlanResponse:
1654
+ """Delete a plan from a product
1655
+
1656
+ DELETE /v1/sdk/products/{productRef}/plans/{planRef}"""
1657
+ data = self._transport.request(
1658
+ "DELETE",
1659
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
1660
+ query={},
1661
+ headers={},
1662
+ body=None,
1663
+ )
1664
+ return self._transport.parse(models.DeletePlanResponse, data)
1665
+
1666
+ def get_plan(
1667
+ self,
1668
+ *,
1669
+ product_ref: str,
1670
+ plan_ref: str,
1671
+ ) -> models.Plan:
1672
+ """Get a plan for a product
1673
+
1674
+ GET /v1/sdk/products/{productRef}/plans/{planRef}"""
1675
+ data = self._transport.request(
1676
+ "GET",
1677
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
1678
+ query={},
1679
+ headers={},
1680
+ body=None,
1681
+ )
1682
+ return self._transport.parse(models.Plan, data)
1683
+
1684
+ def update_plan(
1685
+ self,
1686
+ *,
1687
+ product_ref: str,
1688
+ plan_ref: str,
1689
+ body: models.UpdatePlanRequest | dict[str, Any],
1690
+ ) -> models.Plan:
1691
+ """Update a plan for a product
1692
+
1693
+ PUT /v1/sdk/products/{productRef}/plans/{planRef}"""
1694
+ data = self._transport.request(
1695
+ "PUT",
1696
+ f"/v1/sdk/products/{path_segment(product_ref)}/plans/{path_segment(plan_ref)}",
1697
+ query={},
1698
+ headers={},
1699
+ body=encode_body(body),
1700
+ )
1701
+ return self._transport.parse(models.Plan, data)
1702
+
1703
+ def list_purchases(
1704
+ self,
1705
+ *,
1706
+ status: str | None = None,
1707
+ product_ref: str | None = None,
1708
+ customer_ref: str | None = None,
1709
+ include_free: bool | None = None,
1710
+ ) -> models.ListPurchasesResponse:
1711
+ """List purchases for provider
1712
+
1713
+ GET /v1/sdk/purchases"""
1714
+ data = self._transport.request(
1715
+ "GET",
1716
+ f"/v1/sdk/purchases",
1717
+ query={
1718
+ "status": status,
1719
+ "productRef": product_ref,
1720
+ "customerRef": customer_ref,
1721
+ "includeFree": include_free,
1722
+ },
1723
+ headers={},
1724
+ body=None,
1725
+ )
1726
+ return self._transport.parse(models.ListPurchasesResponse, data)
1727
+
1728
+ def get_purchases_for_customer(
1729
+ self,
1730
+ *,
1731
+ customer_ref: str,
1732
+ include_free: bool | None = None,
1733
+ ) -> models.GetPurchasesForCustomerResponse:
1734
+ """Get purchases for a customer
1735
+
1736
+ GET /v1/sdk/purchases/customer/{customerRef}"""
1737
+ data = self._transport.request(
1738
+ "GET",
1739
+ f"/v1/sdk/purchases/customer/{path_segment(customer_ref)}",
1740
+ query={"includeFree": include_free},
1741
+ headers={},
1742
+ body=None,
1743
+ )
1744
+ return self._transport.parse(models.GetPurchasesForCustomerResponse, data)
1745
+
1746
+ def get_purchases_for_product(
1747
+ self,
1748
+ *,
1749
+ product_ref: str,
1750
+ ) -> models.GetPurchasesForProductResponse:
1751
+ """Get purchases for a product
1752
+
1753
+ GET /v1/sdk/purchases/product/{productRef}"""
1754
+ data = self._transport.request(
1755
+ "GET",
1756
+ f"/v1/sdk/purchases/product/{path_segment(product_ref)}",
1757
+ query={},
1758
+ headers={},
1759
+ body=None,
1760
+ )
1761
+ return self._transport.parse(models.GetPurchasesForProductResponse, data)
1762
+
1763
+ def get_purchase(
1764
+ self,
1765
+ *,
1766
+ purchase_ref: str,
1767
+ ) -> models.SdkPurchaseResponse:
1768
+ """Get a purchase by reference
1769
+
1770
+ GET /v1/sdk/purchases/{purchaseRef}"""
1771
+ data = self._transport.request(
1772
+ "GET",
1773
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}",
1774
+ query={},
1775
+ headers={},
1776
+ body=None,
1777
+ )
1778
+ return self._transport.parse(models.SdkPurchaseResponse, data)
1779
+
1780
+ def cancel_purchase(
1781
+ self,
1782
+ *,
1783
+ purchase_ref: str,
1784
+ body: models.CancelPurchaseRequest | dict[str, Any],
1785
+ ) -> models.CancelPurchaseResponse:
1786
+ """Cancel a purchase
1787
+
1788
+ POST /v1/sdk/purchases/{purchaseRef}/cancel"""
1789
+ data = self._transport.request(
1790
+ "POST",
1791
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}/cancel",
1792
+ query={},
1793
+ headers={},
1794
+ body=encode_body(body),
1795
+ )
1796
+ return self._transport.parse(models.CancelPurchaseResponse, data)
1797
+
1798
+ def reactivate_purchase(
1799
+ self,
1800
+ *,
1801
+ purchase_ref: str,
1802
+ ) -> models.ReactivatePurchaseResponse:
1803
+ """Reactivate a cancelled purchase
1804
+
1805
+ POST /v1/sdk/purchases/{purchaseRef}/reactivate"""
1806
+ data = self._transport.request(
1807
+ "POST",
1808
+ f"/v1/sdk/purchases/{path_segment(purchase_ref)}/reactivate",
1809
+ query={},
1810
+ headers={},
1811
+ body=None,
1812
+ )
1813
+ return self._transport.parse(models.ReactivatePurchaseResponse, data)
1814
+
1815
+ def record_usage(
1816
+ self,
1817
+ *,
1818
+ body: models.CreateUsageRequest | dict[str, Any],
1819
+ ) -> models.UsageRecordResponse:
1820
+ """Record a usage event
1821
+
1822
+ POST /v1/sdk/usages"""
1823
+ data = self._transport.request(
1824
+ "POST",
1825
+ f"/v1/sdk/usages",
1826
+ query={},
1827
+ headers={},
1828
+ body=encode_body(body),
1829
+ )
1830
+ return self._transport.parse(models.UsageRecordResponse, data)
1831
+
1832
+ def record_usage_bulk(
1833
+ self,
1834
+ *,
1835
+ body: models.BulkCreateUsageRequest | dict[str, Any],
1836
+ ) -> models.BulkUsageResponse:
1837
+ """Record bulk usage events
1838
+
1839
+ POST /v1/sdk/usages/bulk"""
1840
+ data = self._transport.request(
1841
+ "POST",
1842
+ f"/v1/sdk/usages/bulk",
1843
+ query={},
1844
+ headers={},
1845
+ body=encode_body(body),
1846
+ )
1847
+ return self._transport.parse(models.BulkUsageResponse, data)
1848
+
1849
+ def get_user_info(
1850
+ self,
1851
+ *,
1852
+ body: models.UserInfoRequest | dict[str, Any],
1853
+ ) -> models.UserInfoResponse:
1854
+ """Get user info and purchase status
1855
+
1856
+ POST /v1/sdk/user-info"""
1857
+ data = self._transport.request(
1858
+ "POST",
1859
+ f"/v1/sdk/user-info",
1860
+ query={},
1861
+ headers={},
1862
+ body=encode_body(body),
1863
+ )
1864
+ return self._transport.parse(models.UserInfoResponse, data)
1865
+
1866
+ def get_webhook_event_schema(
1867
+ self,
1868
+ ) -> models.WebhookEventDto:
1869
+ """Get the webhook event envelope schema
1870
+
1871
+ GET /v1/sdk/webhooks/event-schema"""
1872
+ data = self._transport.request(
1873
+ "GET",
1874
+ f"/v1/sdk/webhooks/event-schema",
1875
+ query={},
1876
+ headers={},
1877
+ body=None,
1878
+ )
1879
+ return self._transport.parse(models.WebhookEventDto, data)
1880
+
1881
+ def list_webhook_event_types(
1882
+ self,
1883
+ ) -> models.ListWebhookEventTypesResponse:
1884
+ """List webhook event types
1885
+
1886
+ GET /v1/sdk/webhooks/event-types"""
1887
+ data = self._transport.request(
1888
+ "GET",
1889
+ f"/v1/sdk/webhooks/event-types",
1890
+ query={},
1891
+ headers={},
1892
+ body=None,
1893
+ )
1894
+ return self._transport.parse(models.ListWebhookEventTypesResponse, data)