Official Selectwin Python SDK — payments (card, PIX, boleto), subscriptions, webhooks.
Project description
selectwin (Python)
Official Selectwin Python SDK — payments (credit card, PIX, boleto), subscriptions, wallets, webhooks and more. Sync and async, fully typed.
Status: early / work in progress (
0.1.0). Generated core (openapi-python-client, httpx sync+async) + a hand-written DX shell (typed errors, retries, idempotency, pagination, webhook verification).
pip install selectwin
Quickstart
import os
from selectwin import Selectwin, CardError
sw = Selectwin(api_key=os.environ["SELECTWIN_API_KEY"]) # sk_test_… / sk_live_…
# Create a PIX transaction (amounts in cents)
tx = sw.transactions.create({"amount": 9990, "payment": {"method": "pix", "currency": "BRL"}})
# id / id+body aliases
one = sw.transactions.retrieve("tra_…")
sw.subscriptions.pause("subs_…")
# Typed errors — branch on the class / error.code, never the message
try:
sw.transactions.create({...})
except CardError as e:
print(e.display_message, e.reversible) # buyer-facing + retryable
Async
import asyncio
from selectwin import AsyncSelectwin
async def main():
async with AsyncSelectwin(api_key="sk_test_…") as sw:
tx = await sw.transactions.create({"amount": 9990, "payment": {"method": "pix", "currency": "BRL"}})
async for t in sw.transactions.list(limit=100):
...
asyncio.run(main())
Pagination
Top-level list() methods return a pager that is both a page fetcher and an iterator:
# sync — stream every transaction across all pages
for tx in sw.transactions.list(limit=100):
...
first_page = sw.transactions.list(limit=20).first() # a page object (.data, .has_more, …)
some = sw.customers.list().to_list(max=500) # collect, optionally capped
# async
async for tx in sw.transactions.list(limit=100):
...
The full generated API (every operation_id) is always reachable via .raw:
from selectwin._core.api.transactions import create_transaction
# or the bound escape hatch:
sw.transactions.raw # the generated module for this resource
Webhooks
# raw_body MUST be the exact bytes/str received (do not re-serialize)
event = sw.webhooks.construct_event(
raw_body,
request.headers["x-selectwin-signature"],
os.environ["SELECTWIN_WEBHOOK_SECRET"], # whsec_…
)
if event.type == "transaction.approved":
obj = event.payload.object
WEBHOOK_EVENT_TYPES (the authoritative catalog) and is_webhook_event_type() are
exported for validation; WebhookEventType is a typing.Literal of every event type.
What the SDK adds over the raw generated client
The package is a generated core (openapi-python-client, from the OpenAPI v2.0.0 spec) + a hand-written DX shell:
- Typed clients —
Selectwin(api_key=…)(sync) andAsyncSelectwin(api_key=…)(async context manager) exposingsw.transactions,sw.subscriptions,sw.customers, … - Stripe-style aliases per resource (
create/retrieve/update/list/delete+ custom verbs), accepting a dict or the generated body model;.rawexposes the full generated surface. - Typed errors by HTTP status /
error.code:CardError(402,display_message/reversible),ValidationError(params),RateLimitError(retry_after),AuthenticationError,PermissionDeniedError,NotFoundError,ConflictError,APIError,APIConnectionError. - Auto-retries (429/5xx/network) with exponential backoff, honouring
Retry-After. - Idempotency — an
X-Idempotency-Keyis added to every mutation (override per call). - Timeouts and one shared, pre-authenticated
httpxclient per SDK client. - Auto-pagination — sync (
for …) and async (async for …) iterators,.first(),.to_list(max=…),.pages(). - Webhook verification —
construct_event(HMAC-SHA256 of the raw body, constant-time).
Auth is the SelectKey header; the environment (sandbox/production) is resolved from the
key prefix (sk_test_ / sk_live_).
Architecture
src/selectwin/
_core/ # openapi-python-client output — DO NOT edit; synced from selectwin-sdks
resources.py # GENERATED Stripe-style namespaces (sync + async) — DO NOT edit
webhook_events.py # GENERATED webhook Event Catalog (types + guard) — DO NOT edit
errors.py # typed error hierarchy
http.py # httpx transport (retries/timeout) + hooks (idempotency, UA) + error mapping
pagination.py # SyncPager / AsyncPager
webhooks.py # construct_event (signature verification)
client.py # Selectwin / AsyncSelectwin — wire auth + the custom httpx client
Cross-cutting concerns are injected once into the httpx client shared by the generated core, so every endpoint inherits them and new endpoints work automatically on regen.
Development
pip install -e ".[dev]"
python scripts/sync_core.py # copy the generated core from selectwin-sdks + regen
python scripts/gen_resources.py # regenerate src/selectwin/resources.py
python scripts/gen_webhook_events.py # regenerate src/selectwin/webhook_events.py
pytest # unit suite
pytest -m integration # sandbox suite (needs SELECTWIN_SANDBOX_KEY; see tests/integration)
mypy src/selectwin # type-check the DX shell
Roadmap
- Publish to PyPI (Trusted Publishing / OIDC) once the API stabilises; CI on PRs.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file selectwin-0.1.0.tar.gz.
File metadata
- Download URL: selectwin-0.1.0.tar.gz
- Upload date:
- Size: 393.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c148039081c2d19139f10be58690b872d12b682b53a8e72cb10da75822f02d40
|
|
| MD5 |
06b5c49846d8f82be222e3cb9281c1fa
|
|
| BLAKE2b-256 |
99c23b2f90d7fc35a7f910989fa13357dbd3f67d76892d915498431accc8bf4e
|
Provenance
The following attestation bundles were made for selectwin-0.1.0.tar.gz:
Publisher:
release.yml on selectwin/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
selectwin-0.1.0.tar.gz -
Subject digest:
c148039081c2d19139f10be58690b872d12b682b53a8e72cb10da75822f02d40 - Sigstore transparency entry: 2044374663
- Sigstore integration time:
-
Permalink:
selectwin/sdk-python@54079c82ee808f804b2bf912b1a1c9e2ff048a25 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/selectwin
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@54079c82ee808f804b2bf912b1a1c9e2ff048a25 -
Trigger Event:
push
-
Statement type:
File details
Details for the file selectwin-0.1.0-py3-none-any.whl.
File metadata
- Download URL: selectwin-0.1.0-py3-none-any.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96ded86e39dd5190a0ab1c09aa42cc811610336c9d01fe6f59eb8e93a928bb79
|
|
| MD5 |
ec7cff54985c5efa9fc96f1d5967d544
|
|
| BLAKE2b-256 |
68de493a8815eff51aa5eae0b993569508caad8de904475447fd5b01d4ae7c9a
|
Provenance
The following attestation bundles were made for selectwin-0.1.0-py3-none-any.whl:
Publisher:
release.yml on selectwin/sdk-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
selectwin-0.1.0-py3-none-any.whl -
Subject digest:
96ded86e39dd5190a0ab1c09aa42cc811610336c9d01fe6f59eb8e93a928bb79 - Sigstore transparency entry: 2044374685
- Sigstore integration time:
-
Permalink:
selectwin/sdk-python@54079c82ee808f804b2bf912b1a1c9e2ff048a25 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/selectwin
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@54079c82ee808f804b2bf912b1a1c9e2ff048a25 -
Trigger Event:
push
-
Statement type: