Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
737 changes: 737 additions & 0 deletions .claude-pr/CLAUDE.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "blindpay"
version = "1.3.0"
version = "1.4.0"
description = "Official Python SDK for the Blindpay API — Global payments infrastructure"
readme = "README.md"
authors = [{ name = "Blindpay", email = "alves@blindpay.com" }]
Expand Down
2 changes: 1 addition & 1 deletion src/blindpay/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "1.3.0"
__version__ = "1.4.0"

from ._internal.exceptions import BlindPayError
from .client import BlindPay, BlindPaySync
Expand Down
2 changes: 1 addition & 1 deletion src/blindpay/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
from blindpay.resources.wallets.offramp import OfframpWalletsResource, OfframpWalletsResourceSync
from blindpay.resources.webhooks.webhooks import WebhookEndpointsResource, WebhookEndpointsResourceSync

__version__ = "1.3.0"
__version__ = "1.4.0"

T = TypeVar("T")

Expand Down
18 changes: 15 additions & 3 deletions src/blindpay/resources/available/available.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
BankDetailKey = Literal[
"type",
"name",
"status",
"recipient_relationship",
"swift_payment_code",
"pix_key",
"force_cpf_cnpj",
"beneficiary_name",
"routing_number",
"account_number",
Expand All @@ -22,6 +26,10 @@
"postal_code",
"checkbook_account_id",
"checkbook_user_key",
"onemoney_external_account_id",
"pix_safe_bank_code",
"pix_safe_branch_code",
"pix_safe_cpf_cnpj",
"spei_protocol",
"spei_institution_code",
"spei_clabe",
Expand Down Expand Up @@ -54,6 +62,10 @@
"swift_intermediary_bank_account_number_iban",
"swift_intermediary_bank_name",
"swift_intermediary_bank_country",
"business_industry",
"phone_number",
"tax_id",
"date_of_birth",
]


Expand All @@ -68,7 +80,7 @@ class BankDetail(TypedDict):
regex: str
key: BankDetailKey
items: Optional[List[BankDetailItem]]
required: bool
required: Optional[bool]


class RailInfo(TypedDict):
Expand Down Expand Up @@ -96,8 +108,8 @@ class SwiftCodeBankDetail(TypedDict):


class NaicsCode(TypedDict):
code: str
title: str
label: str
value: str


GetNaicsCodesResponse = List[NaicsCode]
Expand Down
27 changes: 13 additions & 14 deletions src/blindpay/resources/bank_accounts/bank_accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

ArgentinaTransfers = Literal["CVU", "CBU", "ALIAS"]
AchCopDocument = Literal["CC", "CE", "NIT", "PASS", "PEP"]
BankAccountStatus = Literal["verifying", "approved", "rejected", "deprecated"]
OfframpNetwork = Literal["tron"]
PixType = Literal["pix"]
TransfersBitsoType = Literal["transfers_bitso"]
Expand Down Expand Up @@ -84,26 +85,24 @@ class BankAccount(TypedDict):
swift_intermediary_bank_country: Optional[Country]
tron_wallet_hash: Optional[str]
offramp_wallets: Optional[List[OfframpWallet]]
created_at: str
status: Optional[BankAccountStatus]
recipient_relationship: Optional[RecipientRelationship]
swift_payment_code: Optional[str]
business_industry: Optional[str]
phone_number: Optional[str]
tax_id: Optional[str]
date_of_birth: Optional[str]
pix_safe_bank_code: Optional[str]
pix_safe_branch_code: Optional[str]
pix_safe_cpf_cnpj: Optional[str]
created_at: Optional[str]


class ListBankAccountsResponse(TypedDict):
data: List[BankAccount]


class GetBankAccountResponse(TypedDict):
id: str
receiver_id: str
account_holder_name: str
account_number: str
routing_number: str
account_type: BankAccountType
bank_name: str
swift_code: Optional[str]
iban: Optional[str]
is_primary: bool
created_at: str
updated_at: str
GetBankAccountResponse = BankAccount


class CreatePixInput(TypedDict):
Expand Down
32 changes: 24 additions & 8 deletions src/blindpay/resources/fees/fees.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,33 @@


class FeeOptions(TypedDict):
payin_flat: float
payin_percentage: float
payout_flat: float
payout_percentage: float
payin_flat: int
payin_percentage: int
payout_flat: int
payout_percentage: int


class FeesResponse(TypedDict):
ach: Optional[FeeOptions]
domestic_wire: Optional[FeeOptions]
pix: Optional[FeeOptions]
solana: Optional[FeeOptions]
id: str
instance_id: str
ach: FeeOptions
domestic_wire: FeeOptions
rtp: FeeOptions
international_swift: FeeOptions
pix: FeeOptions
pix_safe: FeeOptions
ach_colombia: FeeOptions
transfers_3: FeeOptions
spei: FeeOptions
tron: FeeOptions
ethereum: FeeOptions
polygon: FeeOptions
base: FeeOptions
arbitrum: FeeOptions
stellar: FeeOptions
solana: FeeOptions
created_at: Optional[str]
updated_at: Optional[str]


class FeesResource:
Expand Down
91 changes: 37 additions & 54 deletions src/blindpay/resources/payins/payins.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Optional, TypedDict
from typing import Any, Dict, List, Optional, TypedDict
from urllib.parse import urlencode

from ..._internal.api_client import InternalApiClient, InternalApiClientSync
Expand Down Expand Up @@ -64,31 +64,39 @@ class Payin(TypedDict):
status: TransactionStatus
payin_quote_id: str
instance_id: str
tracking_transaction: Optional[TrackingTransaction]
tracking_payment: Optional[TrackingPayment]
tracking_complete: Optional[TrackingComplete]
partner_fee: Optional[int]
tracking_transaction: TrackingTransaction
tracking_payment: TrackingPayment
tracking_complete: TrackingComplete
tracking_partner_fee: Optional[TrackingPartnerFee]
created_at: str
updated_at: str
created_at: Optional[str]
updated_at: Optional[str]
image_url: Optional[str]
first_name: Optional[str]
last_name: Optional[str]
legal_name: Optional[str]
type: str
payment_method: str
sender_amount: float
receiver_amount: float
sender_amount: Optional[float]
receiver_amount: Optional[float]
token: StablecoinToken
partner_fee_amount: float
total_fee_amount: float
commercial_quotation: float
blindpay_quotation: float
partner_fee_amount: Optional[float]
total_fee_amount: Optional[float]
commercial_quotation: Optional[float]
blindpay_quotation: Optional[float]
currency: str
billing_fee: float
billing_fee_amount: Optional[float]
transaction_fee_amount: Optional[float]
is_otc: Optional[bool]
payer_rules: Optional[Dict[str, Any]]
name: str
address: str
address: Optional[str]
network: Network
blindpay_bank_details: BankDetails
blindpay_bank_details: Optional[BankDetails]
pse_payment_link: Optional[str]
pse_full_name: Optional[str]
pse_tax_id: Optional[str]
pse_document_type: Optional[str]


class ListPayinsInput(PaginationParams):
Expand Down Expand Up @@ -125,40 +133,7 @@ class GetPayinTrackingTransaction(TypedDict):
description: str


class GetPayinTrackResponse(TypedDict):
receiver_id: str
id: str
pix_code: str
memo_code: str
clabe: str
status: str
payin_quote_id: str
instance_id: str
tracking_transaction: TrackingTransaction
tracking_payment: TrackingPayment
tracking_complete: TrackingComplete
tracking_partner_fee: TrackingPartnerFee
created_at: str
updated_at: str
image_url: str
first_name: str
last_name: str
legal_name: str
type: str
payment_method: str
sender_amount: float
receiver_amount: float
token: StablecoinToken
partner_fee_amount: float
total_fee_amount: float
commercial_quotation: float
blindpay_quotation: float
currency: str
billing_fee: float
name: str
address: str
network: Network
blindpay_bank_details: BankDetails
GetPayinTrackResponse = Payin


class ExportPayinsInput(TypedDict):
Expand All @@ -176,13 +151,18 @@ class CreateEvmPayinResponse(TypedDict):
pix_code: Optional[str]
memo_code: Optional[str]
clabe: Optional[str]
tracking_complete: Optional[TrackingComplete]
tracking_payment: Optional[TrackingPayment]
tracking_transaction: Optional[TrackingTransaction]
partner_fee: Optional[int]
tracking_complete: TrackingComplete
tracking_payment: TrackingPayment
tracking_transaction: TrackingTransaction
tracking_partner_fee: Optional[TrackingPartnerFee]
billing_fee_amount: Optional[float]
transaction_fee_amount: Optional[float]
blindpay_bank_details: BankDetails
receiver_id: str
receiver_amount: float
receiver_id: Optional[str]
receiver_amount: Optional[float]
payment_method: Optional[str]
sender_amount: Optional[float]


class PayinsResource:
Expand All @@ -206,6 +186,9 @@ async def export(self, params: ExportPayinsInput) -> BlindpayApiResponse[ExportP
query_string = f"?{urlencode(filtered_params)}" if filtered_params else ""
return await self._client.get(f"/instances/{self._instance_id}/export/payins{query_string}")

async def get_track(self, payin_id: str) -> BlindpayApiResponse[GetPayinTrackResponse]:
return await self._client.get(f"/e/payins/{payin_id}")

async def create_evm(self, payin_quote_id: str) -> BlindpayApiResponse[CreateEvmPayinResponse]:
return await self._client.post(f"/instances/{self._instance_id}/payins/evm", {"payin_quote_id": payin_quote_id})

Expand Down
38 changes: 22 additions & 16 deletions src/blindpay/resources/payins/quotes.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Literal, Optional
from typing import List, Optional, Union

from typing_extensions import TypedDict

Expand All @@ -7,43 +7,49 @@
BlindpayApiResponse,
Currency,
CurrencyType,
PaymentMethod,
StablecoinToken,
)

PaymentMethod = Literal["ach", "wire", "pix", "spei"]


class PayerRules(TypedDict, total=False):
pix_allowed_tax_ids: List[str]


class CreatePayinQuoteInput(TypedDict):
blockchain_wallet_id: str
class _CreatePayinQuoteInputRequired(TypedDict):
currency_type: CurrencyType
payment_method: PaymentMethod
request_amount: float
request_amount: int
token: StablecoinToken
cover_fees: bool


class CreatePayinQuoteInput(_CreatePayinQuoteInputRequired, total=False):
blockchain_wallet_id: Optional[str]
wallet_id: Optional[str]
cover_fees: Optional[bool]
partner_fee_id: Optional[str]
payer_rules: PayerRules
payer_rules: Optional[PayerRules]
is_otc: Optional[bool]


class CreatePayinQuoteResponse(TypedDict):
id: str
expires_at: int
commercial_quotation: float
blindpay_quotation: float
receiver_amount: float
sender_amount: float
expires_at: Optional[float]
commercial_quotation: Optional[float]
blindpay_quotation: Optional[float]
receiver_amount: Optional[float]
sender_amount: Optional[float]
partner_fee_amount: Optional[float]
flat_fee: Optional[float]
billing_fee_amount: Optional[float]
is_otc: Optional[bool]


class GetPayinFxRateInput(TypedDict):
currency_type: CurrencyType
from_currency: Currency # 'from' is a reserved keyword in Python
to: Currency
request_amount: float
from_currency: Union[StablecoinToken, Currency] # 'from' is a reserved keyword in Python
to: Union[StablecoinToken, Currency]
request_amount: int


class GetPayinFxRateResponse(TypedDict):
Expand Down
Loading
Loading