Skip to content

Commit 02b9d2d

Browse files
authored
feat: update SDK to v1.3.0 (#16)
* feat: update SDK to v2.0.0 with new resources and breaking changes Add transfers, custodial wallets, and fees resources (async + sync). Add pix_safe rail, solana/solana_devnet networks, pending_review status. Add recipient_relationship, account_class, address fields to bank account inputs. Add payout document submission, NAICS codes endpoint. Add 10 new webhook events (22 total). Fix receiver update to use PUT instead of PATCH. Add 22 new tests (171 total). * fix: bump version to 1.3.0 (minor, not major) * fix: resolve type checking errors
1 parent 499c1b9 commit 02b9d2d

20 files changed

Lines changed: 1212 additions & 15 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "blindpay"
3-
version = "1.2.0"
3+
version = "1.3.0"
44
description = "Official Python SDK for the Blindpay API — Global payments infrastructure"
55
readme = "README.md"
66
authors = [{ name = "Blindpay", email = "[email protected]" }]

src/blindpay/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "1.2.0"
1+
__version__ = "1.3.0"
22

33
from ._internal.exceptions import BlindPayError
44
from .client import BlindPay, BlindPaySync
@@ -15,7 +15,9 @@
1515
Network,
1616
PaginationMetadata,
1717
PaginationParams,
18+
PaymentMethod,
1819
Rail,
20+
RecipientRelationship,
1921
StablecoinToken,
2022
TrackingComplete,
2123
TrackingLiquidity,
@@ -36,7 +38,9 @@
3638
"Currency",
3739
"CurrencyType",
3840
"Network",
41+
"PaymentMethod",
3942
"Rail",
43+
"RecipientRelationship",
4044
"StablecoinToken",
4145
"TransactionDocumentType",
4246
"TransactionStatus",

src/blindpay/client.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
from blindpay.resources.api_keys.api_keys import ApiKeysResource, ApiKeysResourceSync
1414
from blindpay.resources.available.available import AvailableResource, AvailableResourceSync
1515
from blindpay.resources.bank_accounts.bank_accounts import BankAccountsResource, BankAccountsResourceSync
16+
from blindpay.resources.custodial_wallets.custodial_wallets import (
17+
CustodialWalletsResource,
18+
CustodialWalletsResourceSync,
19+
)
20+
from blindpay.resources.fees.fees import FeesResource, FeesResourceSync
1621
from blindpay.resources.instances.instances import InstancesResource, InstancesResourceSync
1722
from blindpay.resources.partner_fees.partner_fees import PartnerFeesResource, PartnerFeesResourceSync
1823
from blindpay.resources.payins.payins import PayinsResource, PayinsResourceSync
@@ -24,6 +29,7 @@
2429
TermsOfServiceResource,
2530
TermsOfServiceResourceSync,
2631
)
32+
from blindpay.resources.transfers.transfers import TransfersResource, TransfersResourceSync
2733
from blindpay.resources.virtual_accounts.virtual_accounts import (
2834
VirtualAccountsResource,
2935
VirtualAccountsResourceSync,
@@ -32,7 +38,7 @@
3238
from blindpay.resources.wallets.offramp import OfframpWalletsResource, OfframpWalletsResourceSync
3339
from blindpay.resources.webhooks.webhooks import WebhookEndpointsResource, WebhookEndpointsResourceSync
3440

35-
__version__ = "1.1.0"
41+
__version__ = "1.3.0"
3642

3743
T = TypeVar("T")
3844

@@ -234,6 +240,12 @@ def offramp(self) -> "OfframpWalletsResource":
234240

235241
return create_offramp_wallets_resource(self._instance_id, self._api)
236242

243+
@cached_property
244+
def custodial(self) -> "CustodialWalletsResource":
245+
from blindpay.resources.custodial_wallets.custodial_wallets import create_custodial_wallets_resource
246+
247+
return create_custodial_wallets_resource(self._instance_id, self._api)
248+
237249

238250
class BlindPay:
239251
_api_key: str
@@ -306,6 +318,18 @@ def virtual_accounts(self) -> "VirtualAccountsResource":
306318
def wallets(self) -> _WalletsNamespace:
307319
return _WalletsNamespace(self._instance_id, self._api)
308320

321+
@cached_property
322+
def transfers(self) -> "TransfersResource":
323+
from blindpay.resources.transfers import create_transfers_resource
324+
325+
return create_transfers_resource(self._instance_id, self._api)
326+
327+
@cached_property
328+
def fees(self) -> "FeesResource":
329+
from blindpay.resources.fees import create_fees_resource
330+
331+
return create_fees_resource(self._instance_id, self._api)
332+
309333
def verify_webhook_signature(
310334
self, *, secret: str, id: str, timestamp: str, payload: str, svix_signature: str
311335
) -> bool:
@@ -434,6 +458,12 @@ def offramp(self) -> "OfframpWalletsResourceSync":
434458

435459
return create_offramp_wallets_resource_sync(self._instance_id, self._api)
436460

461+
@cached_property
462+
def custodial(self) -> "CustodialWalletsResourceSync":
463+
from blindpay.resources.custodial_wallets.custodial_wallets import create_custodial_wallets_resource_sync
464+
465+
return create_custodial_wallets_resource_sync(self._instance_id, self._api)
466+
437467

438468
class BlindPaySync:
439469
_api_key: str
@@ -506,6 +536,18 @@ def virtual_accounts(self) -> "VirtualAccountsResourceSync":
506536
def wallets(self) -> _WalletsNamespaceSync:
507537
return _WalletsNamespaceSync(self._instance_id, self._api)
508538

539+
@cached_property
540+
def transfers(self) -> "TransfersResourceSync":
541+
from blindpay.resources.transfers import create_transfers_resource_sync
542+
543+
return create_transfers_resource_sync(self._instance_id, self._api)
544+
545+
@cached_property
546+
def fees(self) -> "FeesResourceSync":
547+
from blindpay.resources.fees import create_fees_resource_sync
548+
549+
return create_fees_resource_sync(self._instance_id, self._api)
550+
509551
def verify_webhook_signature(
510552
self, *, secret: str, id: str, timestamp: str, payload: str, svix_signature: str
511553
) -> bool:

src/blindpay/resources/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
from .api_keys import create_api_keys_resource
22
from .available import create_available_resource
33
from .bank_accounts import create_bank_accounts_resource
4+
from .custodial_wallets import create_custodial_wallets_resource
5+
from .fees import create_fees_resource
46
from .instances import create_instances_resource
57
from .partner_fees import create_partner_fees_resource
68
from .payins import create_payin_quotes_resource, create_payins_resource
79
from .payouts import create_payouts_resource
810
from .quotes import create_quotes_resource
911
from .receivers import create_receivers_resource
1012
from .terms_of_service import create_terms_of_service_resource
13+
from .transfers import create_transfers_resource
1114
from .virtual_accounts import create_virtual_accounts_resource
1215
from .wallets import create_blockchain_wallets_resource, create_offramp_wallets_resource
1316
from .webhooks import create_webhook_endpoints_resource
@@ -16,6 +19,8 @@
1619
"create_api_keys_resource",
1720
"create_available_resource",
1821
"create_bank_accounts_resource",
22+
"create_custodial_wallets_resource",
23+
"create_fees_resource",
1924
"create_instances_resource",
2025
"create_partner_fees_resource",
2126
"create_payins_resource",
@@ -24,6 +29,7 @@
2429
"create_quotes_resource",
2530
"create_receivers_resource",
2631
"create_terms_of_service_resource",
32+
"create_transfers_resource",
2733
"create_virtual_accounts_resource",
2834
"create_blockchain_wallets_resource",
2935
"create_offramp_wallets_resource",

src/blindpay/resources/available/available.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ class SwiftCodeBankDetail(TypedDict):
9595
GetSwiftCodeBankDetailsResponse = List[SwiftCodeBankDetail]
9696

9797

98+
class NaicsCode(TypedDict):
99+
code: str
100+
title: str
101+
102+
103+
GetNaicsCodesResponse = List[NaicsCode]
104+
105+
98106
class AvailableResource:
99107
def __init__(self, client: InternalApiClient):
100108
self._client = client
@@ -108,6 +116,9 @@ async def get_rails(self) -> BlindpayApiResponse[GetRailsResponse]:
108116
async def get_swift_code_bank_details(self, swift: str) -> BlindpayApiResponse[GetSwiftCodeBankDetailsResponse]:
109117
return await self._client.get(f"/available/swift/{swift}")
110118

119+
async def get_naics_codes(self) -> BlindpayApiResponse[GetNaicsCodesResponse]:
120+
return await self._client.get("/available/naics")
121+
111122

112123
class AvailableResourceSync:
113124
"""Synchronous version of AvailableResource"""
@@ -124,6 +135,9 @@ def get_rails(self) -> BlindpayApiResponse[GetRailsResponse]:
124135
def get_swift_code_bank_details(self, swift: str) -> BlindpayApiResponse[GetSwiftCodeBankDetailsResponse]:
125136
return self._client.get(f"/available/swift/{swift}")
126137

138+
def get_naics_codes(self) -> BlindpayApiResponse[GetNaicsCodesResponse]:
139+
return self._client.get("/available/naics")
140+
127141

128142
def create_available_resource(client: InternalApiClient) -> AvailableResource:
129143
return AvailableResource(client)

src/blindpay/resources/bank_accounts/bank_accounts.py

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33
from typing_extensions import TypedDict
44

55
from ..._internal.api_client import InternalApiClient, InternalApiClientSync
6-
from ...types import AccountClass, BankAccountType, BlindpayApiResponse, Country, Rail, SpeiProtocol
6+
from ...types import (
7+
AccountClass,
8+
BankAccountType,
9+
BlindpayApiResponse,
10+
Country,
11+
Rail,
12+
RecipientRelationship,
13+
SpeiProtocol,
14+
)
715

816
ArgentinaTransfers = Literal["CVU", "CBU", "ALIAS"]
917
AchCopDocument = Literal["CC", "CE", "NIT", "PASS", "PEP"]
@@ -16,6 +24,7 @@
1624
WireType = Literal["wire"]
1725
InternationalSwiftType = Literal["international_swift"]
1826
RtpType = Literal["rtp"]
27+
PixSafeType = Literal["pix_safe"]
1928

2029

2130
class OfframpWallet(TypedDict):
@@ -177,14 +186,28 @@ class CreateColombiaAchResponse(TypedDict):
177186
created_at: str
178187

179188

180-
class CreateAchInput(TypedDict):
189+
class _CreateAchInputRequired(TypedDict):
181190
receiver_id: str
191+
192+
193+
class CreateAchInput(_CreateAchInputRequired, total=False):
182194
name: str
183195
account_class: AccountClass
184196
account_number: str
185197
account_type: BankAccountType
186198
beneficiary_name: str
187199
routing_number: str
200+
recipient_relationship: RecipientRelationship
201+
address_line_1: str
202+
city: str
203+
state_province_region: str
204+
country: Country
205+
postal_code: str
206+
address_line_2: Optional[str]
207+
business_industry: Optional[str]
208+
phone_number: Optional[str]
209+
tax_id: Optional[str]
210+
date_of_birth: Optional[str]
188211

189212

190213
class CreateAchResponse(TypedDict):
@@ -212,18 +235,27 @@ class CreateAchResponse(TypedDict):
212235
created_at: str
213236

214237

215-
class CreateWireInput(TypedDict):
238+
class _CreateWireInputRequired(TypedDict):
216239
receiver_id: str
240+
241+
242+
class CreateWireInput(_CreateWireInputRequired, total=False):
217243
name: str
218244
account_number: str
245+
account_class: AccountClass
219246
beneficiary_name: str
220247
routing_number: str
248+
recipient_relationship: RecipientRelationship
221249
address_line_1: str
222250
address_line_2: Optional[str]
223251
city: str
224252
state_province_region: str
225253
country: Country
226254
postal_code: str
255+
business_industry: Optional[str]
256+
phone_number: Optional[str]
257+
tax_id: Optional[str]
258+
date_of_birth: Optional[str]
227259

228260

229261
class CreateWireResponse(TypedDict):
@@ -242,9 +274,14 @@ class CreateWireResponse(TypedDict):
242274
created_at: str
243275

244276

245-
class CreateInternationalSwiftInput(TypedDict):
277+
class _CreateInternationalSwiftInputRequired(TypedDict):
246278
receiver_id: str
279+
280+
281+
class CreateInternationalSwiftInput(_CreateInternationalSwiftInputRequired, total=False):
247282
name: str
283+
account_class: AccountClass
284+
recipient_relationship: RecipientRelationship
248285
swift_account_holder_name: str
249286
swift_account_number_iban: str
250287
swift_bank_address_line_1: str
@@ -265,6 +302,11 @@ class CreateInternationalSwiftInput(TypedDict):
265302
swift_intermediary_bank_country: Optional[Country]
266303
swift_intermediary_bank_name: Optional[str]
267304
swift_intermediary_bank_swift_code_bic: Optional[str]
305+
swift_payment_code: Optional[str]
306+
business_industry: Optional[str]
307+
phone_number: Optional[str]
308+
tax_id: Optional[str]
309+
date_of_birth: Optional[str]
268310

269311

270312
class CreateInternationalSwiftResponse(TypedDict):
@@ -301,18 +343,27 @@ class CreateInternationalSwiftResponse(TypedDict):
301343
created_at: str
302344

303345

304-
class CreateRtpInput(TypedDict):
346+
class _CreateRtpInputRequired(TypedDict):
305347
receiver_id: str
348+
349+
350+
class CreateRtpInput(_CreateRtpInputRequired, total=False):
306351
name: str
352+
account_class: AccountClass
307353
beneficiary_name: str
308354
routing_number: str
309355
account_number: str
356+
recipient_relationship: RecipientRelationship
310357
address_line_1: str
311358
address_line_2: Optional[str]
312359
city: str
313360
state_province_region: str
314361
country: Country
315362
postal_code: str
363+
business_industry: Optional[str]
364+
phone_number: Optional[str]
365+
tax_id: Optional[str]
366+
date_of_birth: Optional[str]
316367

317368

318369
class CreateRtpResponse(TypedDict):
@@ -331,6 +382,28 @@ class CreateRtpResponse(TypedDict):
331382
created_at: str
332383

333384

385+
class CreatePixSafeInput(TypedDict):
386+
receiver_id: str
387+
name: str
388+
account_number: str
389+
account_type: BankAccountType
390+
pix_safe_bank_code: str
391+
pix_safe_branch_code: str
392+
pix_safe_cpf_cnpj: str
393+
394+
395+
class CreatePixSafeResponse(TypedDict):
396+
id: str
397+
type: PixSafeType
398+
name: str
399+
account_number: str
400+
account_type: BankAccountType
401+
pix_safe_bank_code: str
402+
pix_safe_branch_code: str
403+
pix_safe_cpf_cnpj: str
404+
created_at: str
405+
406+
334407
class BankAccountsResource:
335408
def __init__(self, instance_id: str, client: InternalApiClient):
336409
self._instance_id = instance_id
@@ -397,6 +470,12 @@ async def create_rtp(self, data: CreateRtpInput) -> BlindpayApiResponse[CreateRt
397470
payload["type"] = "rtp"
398471
return await self._client.post(f"/instances/{self._instance_id}/receivers/{receiver_id}/bank-accounts", payload)
399472

473+
async def create_pix_safe(self, data: CreatePixSafeInput) -> BlindpayApiResponse[CreatePixSafeResponse]:
474+
receiver_id = data["receiver_id"]
475+
payload = {k: v for k, v in data.items() if k != "receiver_id"}
476+
payload["type"] = "pix_safe"
477+
return await self._client.post(f"/instances/{self._instance_id}/receivers/{receiver_id}/bank-accounts", payload)
478+
400479

401480
class BankAccountsResourceSync:
402481
def __init__(self, instance_id: str, client: InternalApiClientSync):
@@ -464,6 +543,12 @@ def create_rtp(self, data: CreateRtpInput) -> BlindpayApiResponse[CreateRtpRespo
464543
payload["type"] = "rtp"
465544
return self._client.post(f"/instances/{self._instance_id}/receivers/{receiver_id}/bank-accounts", payload)
466545

546+
def create_pix_safe(self, data: CreatePixSafeInput) -> BlindpayApiResponse[CreatePixSafeResponse]:
547+
receiver_id = data["receiver_id"]
548+
payload = {k: v for k, v in data.items() if k != "receiver_id"}
549+
payload["type"] = "pix_safe"
550+
return self._client.post(f"/instances/{self._instance_id}/receivers/{receiver_id}/bank-accounts", payload)
551+
467552

468553
def create_bank_accounts_resource(instance_id: str, client: InternalApiClient) -> BankAccountsResource:
469554
return BankAccountsResource(instance_id, client)

0 commit comments

Comments
 (0)